{"id":10247,"date":"2026-08-15T00:34:08","date_gmt":"2026-08-14T22:34:08","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/looker-studio-blend-join-planner\/"},"modified":"2026-08-15T00:34:08","modified_gmt":"2026-08-14T22:34:08","slug":"looker-studio-blend-join-planner","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/","title":{"rendered":"Looker Studio Blend &#038; Join Planner"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">A blend in Looker Studio does not add tables, it joins them. If the right side holds more than one row per key, every row on the left is repeated and its metrics are counted several times. The arithmetic below shows that before the chart does.<\/p>\n<div style=\"display: flex; gap: 18px; flex-wrap: wrap;\">\n<div style=\"flex: 1; min-width: 250px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px;\">\n<div style=\"color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 10px;\">Left table<\/div>\n<p>            <label for=\"bl-l-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Name<\/label><br \/>\n            <input type=\"text\" id=\"bl-l-name\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box; margin-bottom: 10px;\" value=\"GA4 Sitzungen\"><br \/>\n            <label for=\"bl-l-zeilen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Rows<\/label><br \/>\n            <input type=\"text\" id=\"bl-l-zeilen\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box; margin-bottom: 10px;\" value=\"1000\"><br \/>\n            <label for=\"bl-l-schluessel\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Distinct values of the join key<\/label><br \/>\n            <input type=\"text\" id=\"bl-l-schluessel\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"1000\">\n        <\/div>\n<div style=\"flex: 1; min-width: 250px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px;\">\n<div style=\"color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 10px;\">Right table<\/div>\n<p>            <label for=\"bl-r-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Name<\/label><br \/>\n            <input type=\"text\" id=\"bl-r-name\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box; margin-bottom: 10px;\" value=\"Google Ads Kosten\"><br \/>\n            <label for=\"bl-r-zeilen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Rows<\/label><br \/>\n            <input type=\"text\" id=\"bl-r-zeilen\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box; margin-bottom: 10px;\" value=\"3000\"><br \/>\n            <label for=\"bl-r-schluessel\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Distinct values of the join key<\/label><br \/>\n            <input type=\"text\" id=\"bl-r-schluessel\" class=\"form-control\" style=\"width: 100%; padding: 9px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"1000\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 15px;\">\n<div style=\"flex: 1; min-width: 190px;\">\n            <label for=\"bl-art\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Join type<\/label><br \/>\n            <select id=\"bl-art\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"links\">left outer<\/option><option value=\"innen\">inner<\/option><option value=\"rechts\">right outer<\/option><option value=\"voll\">full outer<\/option><option value=\"kreuz\">cross<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 190px;\">\n            <label for=\"bl-treffer\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Share of left keys found on the right, in percent<\/label><br \/>\n            <input type=\"text\" id=\"bl-treffer\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"80\">\n        <\/div>\n<div style=\"flex: 1; min-width: 190px;\">\n            <label for=\"bl-kennzahl\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Metric of the left table (sum)<\/label><br \/>\n            <input type=\"text\" id=\"bl-kennzahl\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"12500\">\n        <\/div>\n<div style=\"flex: 1; min-width: 190px;\">\n            <label for=\"bl-felder\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Join fields<\/label><br \/>\n            <input type=\"text\" id=\"bl-felder\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"Kampagne, Datum\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"bl-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Work it out<\/button><br \/>\n        <button id=\"bl-beispiel\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Load example<\/button>\n    <\/div>\n<div id=\"bl-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"A blend in Looker Studio does not add tables, it joins them. If the right side holds more than one row per key, every row on the left is repeated and its metrics are counted several times. The arithmetic below shows that before the chart does.\",\"h_links\":\"Left table\",\"h_rechts\":\"Right table\",\"label_quelle\":\"Name\",\"label_zeilen\":\"Rows\",\"label_schluessel\":\"Distinct values of the join key\",\"label_art\":\"Join type\",\"art_links\":\"left outer\",\"art_innen\":\"inner\",\"art_rechts\":\"right outer\",\"art_voll\":\"full outer\",\"art_kreuz\":\"cross\",\"label_treffer\":\"Share of left keys found on the right, in percent\",\"label_kennzahl\":\"Metric of the left table (sum)\",\"label_felder\":\"Join fields\",\"knopf\":\"Work it out\",\"beispiel\":\"Load example\",\"fehler_zeilen\":\"Both row counts have to be whole numbers above zero.\",\"fehler_schluessel\":\"Both key counts have to be whole numbers above zero.\",\"fehler_mehr_schluessel\":\"A table cannot hold more distinct keys than rows.\",\"fehler_treffer\":\"The share has to lie between 0 and 100.\",\"fehler_kennzahl\":\"The metric has to be a number of 0 or more.\",\"h_ergebnis\":\"What the blend produces\",\"h_befunde\":\"Findings\",\"h_formel\":\"Field for a clean join key\",\"h_pruefliste\":\"Before the blend goes live\",\"z_links_je\":\"Rows per key on the left\",\"z_rechts_je\":\"Rows per key on the right\",\"z_passend\":\"Keys that match\",\"z_zeilen\":\"Rows after the join\",\"z_kennzahl_vorher\":\"Metric before the blend\",\"z_kennzahl_nachher\":\"Metric after the blend\",\"z_faktor\":\"Inflation factor\",\"formel_erklaerung\":\"Keys rarely match by themselves: a stray space or a capital letter is enough to break them apart. A calculated field on both sides puts them on the same footing.\",\"b_kreuz\":\"A cross join pairs every row with every other one. That is almost never what a report needs and grows out of hand quickly.\",\"b_vervielfacht\":\"The right table holds %s rows per key, so every row on the left appears %n times and its metrics are counted that often.\",\"b_beidseitig\":\"Both sides hold several rows per key. The result grows by the product of the two, which is the classic runaway blend.\",\"b_sauber\":\"One row per key on both sides: this join adds columns without multiplying rows.\",\"b_innen_verliert\":\"An inner join drops rows without a partner - about %s rows from the left table disappear from the report.\",\"b_links_leer\":\"Rows on the left without a partner survive, but their columns from the right side stay empty, which shows up as null in charts.\",\"b_wenig_treffer\":\"Only %s percent of the keys match. That usually means the key is built differently on the two sides rather than that the data is missing.\",\"b_mehrere_felder\":\"%s join fields: all of them have to match exactly, and every additional field lowers the number of matches.\",\"b_ohne_feld\":\"No join field is named. Without a key the blend has nothing to join on.\",\"l_datum\":\"The date range of a blend follows the first table. A second date field alongside it produces gaps that look like missing data.\",\"l_granular\":\"Blends join what is already aggregated. Both sides have to be aggregated to the same granularity beforehand, otherwise the join key never matches.\",\"l_kennzahl\":\"Metrics from the right table cannot be re-aggregated afterwards. Whatever arrives multiplied stays multiplied.\",\"l_reihenfolge\":\"The order of the tables decides the result: swapping left and right turns a left join into a different report.\",\"l_gegenprobe\":\"The check that costs a minute: compare the total of one metric before and after the blend. If it grew, the join multiplied rows.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    function zahl(wert) {\n        const roh = String(wert === undefined || wert === null ? '' : wert).trim().replace(\/[\\s.]\/g, '').replace(',', '.');\n        if (roh === '') { return NaN; }\n        if (!\/^[0-9]+(\\.[0-9]+)?$\/.test(roh)) { return NaN; }\n        return parseFloat(roh);\n    }<\/p>\n<p>    function trennen(text) {\n        return String(text === undefined || text === null ? '' : text)\n            .split(\/[,;]+\/)\n            .map(function (s) { return s.trim(); })\n            .filter(function (s) { return s !== ''; });\n    }<\/p>\n<p>    function rechnen(e) {\n        const ergebnis = { ok: false, fehler: '', befunde: [], felder: [] };\n        const eingabe = e || {};<\/p>\n<p>        const lZeilen = zahl(eingabe.lZeilen);\n        const lSchluessel = zahl(eingabe.lSchluessel);\n        const rZeilen = zahl(eingabe.rZeilen);\n        const rSchluessel = zahl(eingabe.rSchluessel);\n        const treffer = zahl(eingabe.treffer);\n        const kennzahl = eingabe.kennzahl === '' || eingabe.kennzahl === undefined ? 0 : zahl(eingabe.kennzahl);<\/p>\n<p>        if (!isFinite(lZeilen) || !isFinite(rZeilen) || lZeilen <= 0 || rZeilen <= 0) {\n            ergebnis.fehler = T.fehler_zeilen;\n            return ergebnis;\n        }\n        if (!isFinite(lSchluessel) || !isFinite(rSchluessel) || lSchluessel <= 0 || rSchluessel <= 0) {\n            ergebnis.fehler = T.fehler_schluessel;\n            return ergebnis;\n        }\n        if (lSchluessel > lZeilen || rSchluessel > rZeilen) {\n            ergebnis.fehler = T.fehler_mehr_schluessel;\n            return ergebnis;\n        }\n        if (!isFinite(treffer) || treffer < 0 || treffer > 100) {\n            ergebnis.fehler = T.fehler_treffer;\n            return ergebnis;\n        }\n        if (!isFinite(kennzahl) || kennzahl < 0) {\n            ergebnis.fehler = T.fehler_kennzahl;\n            return ergebnis;\n        }\n\n        const art = ['links', 'innen', 'rechts', 'voll', 'kreuz'].indexOf(eingabe.art) !== -1 ? eingabe.art : 'links';\n\n        \/\/ Zeilen je Schluessel: genau daran entscheidet sich, ob eine\n        \/\/ Verknuepfung Zeilen vervielfacht.\n        const mLinks = lZeilen \/ lSchluessel;\n        const mRechts = rZeilen \/ rSchluessel;\n        const passendeSchluessel = Math.round(lSchluessel * (treffer \/ 100));\n\n        let zeilen;\n        if (art === 'kreuz') {\n            zeilen = lZeilen * rZeilen;\n        } else {\n            const innen = passendeSchluessel * mLinks * mRechts;\n            const linksAllein = (lSchluessel - passendeSchluessel) * mLinks;\n            \/\/ Wie viele rechte Schluessel keinen Partner haben, laesst sich aus\n            \/\/ der Trefferquote der linken Seite nur schaetzen.\n            const rechtsAllein = Math.max(0, (rSchluessel - passendeSchluessel)) * mRechts;\n            if (art === 'innen') { zeilen = innen; }\n            else if (art === 'links') { zeilen = innen + linksAllein; }\n            else if (art === 'rechts') { zeilen = innen + rechtsAllein; }\n            else { zeilen = innen + linksAllein + rechtsAllein; }\n        }\n\n        const faktor = art === 'kreuz' ? rZeilen : mRechts;\n        const kennzahlNachher = kennzahl * (art === 'kreuz' ? rZeilen : mRechts);\n\n        ergebnis.ok = true;\n        ergebnis.art = art;\n        ergebnis.mLinks = Math.round(mLinks * 100) \/ 100;\n        ergebnis.mRechts = Math.round(mRechts * 100) \/ 100;\n        ergebnis.passendeSchluessel = passendeSchluessel;\n        ergebnis.zeilen = Math.round(zeilen);\n        ergebnis.faktor = Math.round(faktor * 100) \/ 100;\n        ergebnis.kennzahl = kennzahl;\n        ergebnis.kennzahlNachher = Math.round(kennzahlNachher * 100) \/ 100;\n        ergebnis.verloren = art === 'innen' ? Math.round((lSchluessel - passendeSchluessel) * mLinks) : 0;\n        ergebnis.felder = trennen(eingabe.felder);\n\n        \/\/ --- Befunde ---\n        if (art === 'kreuz') {\n            ergebnis.befunde.push({ schwer: true, text: T.b_kreuz });\n        }\n        if (mRechts > 1.01) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_vervielfacht.replace('%s', String(ergebnis.mRechts)).replace('%n', String(ergebnis.faktor)) });\n        }\n        if (mLinks > 1.01 && mRechts > 1.01) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_beidseitig });\n        }\n        if (mRechts <= 1.01 &#038;&#038; mLinks <= 1.01 &#038;&#038; art !== 'kreuz') {\n            ergebnis.befunde.push({ schwer: false, text: T.b_sauber });\n        }\n        if (art === 'innen' &#038;&#038; treffer < 100) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_innen_verliert.replace('%s', String(ergebnis.verloren)) });\n        }\n        if (art === 'links' &#038;&#038; treffer < 100) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_links_leer });\n        }\n        if (treffer < 60) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_wenig_treffer.replace('%s', String(treffer)) });\n        }\n        if (ergebnis.felder.length > 1) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_mehrere_felder.replace('%s', String(ergebnis.felder.length)) });\n        }\n        if (ergebnis.felder.length === 0) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_ohne_feld });\n        }<\/p>\n<p>        \/\/ --- Feld zur Vereinheitlichung des Schluessels ---\n        if (ergebnis.felder.length) {\n            const teile = ergebnis.felder.map(function (f) { return 'LOWER(TRIM(' + f + '))'; });\n            ergebnis.formel = teile.length === 1 ? teile[0] : 'CONCAT(' + teile.join(', \"|\", ') + ')';\n        } else {\n            ergebnis.formel = '';\n        }<\/p>\n<p>        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.BL = { rechnen: rechnen, zahl: zahl, trennen: trennen };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('bl-btn');\n    const out = document.getElementById('bl-ergebnis');\n    const beispielBtn = document.getElementById('bl-beispiel');\n    if (!btn || !out || !beispielBtn) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, text) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (text !== undefined && text !== null) { knoten.textContent = text; }\n        return knoten;\n    }<\/p>\n<p>    function wert(id) {\n        const knoten = document.getElementById(id);\n        return knoten ? knoten.value : '';\n    }<\/p>\n<p>    function zeile(kasten, name, inhalt, hervor) {\n        const z = el('div', 'display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; padding: 5px 0;');\n        z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', name));\n        z.appendChild(el('span', 'color: ' + (hervor ? '#ffb86c' : 'var(--text-primary, #e8e8ee)') + '; font-family: monospace;', inhalt));\n        kasten.appendChild(z);\n    }<\/p>\n<p>    function zeigen(erg) {\n        out.textContent = '';<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_ergebnis));\n        const kasten = el('div', KASTEN);\n        zeile(kasten, T.z_links_je, String(erg.mLinks));\n        zeile(kasten, T.z_rechts_je, String(erg.mRechts), erg.mRechts > 1.01);\n        zeile(kasten, T.z_passend, String(erg.passendeSchluessel));\n        zeile(kasten, T.z_zeilen, String(erg.zeilen), erg.faktor > 1.01);\n        if (erg.kennzahl > 0) {\n            zeile(kasten, T.z_kennzahl_vorher, String(erg.kennzahl));\n            zeile(kasten, T.z_kennzahl_nachher, String(erg.kennzahlNachher), erg.kennzahlNachher > erg.kennzahl * 1.01);\n            zeile(kasten, T.z_faktor, erg.faktor + ' x', erg.faktor > 1.01);\n        }\n        out.appendChild(kasten);<\/p>\n<p>        if (erg.befunde.length) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n            const befunde = el('div', KASTEN);\n            erg.befunde.forEach(function (b) {\n                const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n                z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--accent, #7ee787)') + '; font-family: monospace;', b.schwer ? '!' : '+'));\n                z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n                befunde.appendChild(z);\n            });\n            out.appendChild(befunde);\n        }<\/p>\n<p>        if (erg.formel) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_formel));\n            out.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; margin-bottom: 8px;', T.formel_erklaerung));\n            out.appendChild(el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.85rem; white-space: pre-wrap; word-break: break-all; margin-bottom: 18px;', erg.formel));\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_pruefliste));\n        const liste = el('div', KASTEN);\n        [T.l_datum, T.l_granular, T.l_kennzahl, T.l_reihenfolge, T.l_gegenprobe].forEach(function (text) {\n            liste.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.88rem; line-height: 1.6; padding: 5px 0;', text));\n        });\n        out.appendChild(liste);\n    }<\/p>\n<p>    btn.addEventListener('click', function () {\n        const erg = rechnen({\n            lZeilen: wert('bl-l-zeilen'),\n            lSchluessel: wert('bl-l-schluessel'),\n            rZeilen: wert('bl-r-zeilen'),\n            rSchluessel: wert('bl-r-schluessel'),\n            art: wert('bl-art'),\n            treffer: wert('bl-treffer'),\n            kennzahl: wert('bl-kennzahl'),\n            felder: wert('bl-felder')\n        });\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }\n        zeigen(erg);\n    });<\/p>\n<p>    beispielBtn.addEventListener('click', function () {\n        document.getElementById('bl-l-zeilen').value = '1000';\n        document.getElementById('bl-l-schluessel').value = '1000';\n        document.getElementById('bl-r-zeilen').value = '3000';\n        document.getElementById('bl-r-schluessel').value = '1000';\n        document.getElementById('bl-art').value = 'links';\n        document.getElementById('bl-treffer').value = '80';\n        document.getElementById('bl-kennzahl').value = '12500';\n        document.getElementById('bl-felder').value = 'Kampagne, Datum';\n        btn.click();\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Works out how many rows a blend produces and by which factor a metric of the left table is inflated before the numbers reach a chart.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91297,91258],"class_list":["post-10247","page","type-page","status-publish","hentry","tag-data-quality","tag-google-analytics-4"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Looker Studio Blend &amp; Join Planner - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Looker Studio Blend &amp; Join Planner - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Works out how many rows a blend produces and by which factor a metric of the left table is inflated before the numbers reach a chart.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/looker-studio-blend-join-planner\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/looker-studio-blend-join-planner\\\/\",\"name\":\"Looker Studio Blend & Join Planner - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:34:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/looker-studio-blend-join-planner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/looker-studio-blend-join-planner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/looker-studio-blend-join-planner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Looker Studio Blend &#038; Join Planner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Looker Studio Blend & Join Planner - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/","og_locale":"en_US","og_type":"article","og_title":"Looker Studio Blend & Join Planner - Lukas Wojcik - Blog","og_description":"Works out how many rows a blend produces and by which factor a metric of the left table is inflated before the numbers reach a chart.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/","name":"Looker Studio Blend & Join Planner - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:34:08+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/looker-studio-blend-join-planner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Looker Studio Blend &#038; Join Planner"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10247"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10247\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10247"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}