{"id":10249,"date":"2026-08-15T00:34:11","date_gmt":"2026-08-14T22:34:11","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/looker-studio-blend-join-planner\/"},"modified":"2026-08-15T00:34:11","modified_gmt":"2026-08-14T22:34:11","slug":"looker-studio-blend-join-planner","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/looker-studio-blend-join-planner\/","title":{"rendered":"Planer po\u0142\u0105cze\u0144 danych w Looker Studio"},"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;\">Po\u0142\u0105czenie danych w Looker Studio nie dodaje tabel, tylko je \u0142\u0105czy. Je\u015bli prawa strona ma wi\u0119cej ni\u017c jeden wiersz na klucz, ka\u017cdy wiersz z lewej zostaje powielony, a jego miary licz\u0105 si\u0119 wielokrotnie. Poni\u017csze wyliczenie pokazuje to wcze\u015bniej ni\u017c wykres.<\/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;\">Lewa tabela<\/div>\n<p>            <label for=\"bl-l-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Nazwa<\/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;\">Wiersze<\/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;\">R\u00f3\u017cne warto\u015bci klucza<\/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;\">Prawa tabela<\/div>\n<p>            <label for=\"bl-r-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.8rem; margin-bottom: 4px;\">Nazwa<\/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;\">Wiersze<\/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;\">R\u00f3\u017cne warto\u015bci klucza<\/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;\">Rodzaj po\u0142\u0105czenia<\/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\">lewe zewn\u0119trzne<\/option><option value=\"innen\">wewn\u0119trzne<\/option><option value=\"rechts\">prawe zewn\u0119trzne<\/option><option value=\"voll\">pe\u0142ne zewn\u0119trzne<\/option><option value=\"kreuz\">krzy\u017cowe<\/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;\">Udzia\u0142 kluczy z lewej wyst\u0119puj\u0105cych po prawej, w procentach<\/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;\">Miara lewej tabeli (suma)<\/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;\">Pola \u0142\u0105czenia<\/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;\">Przelicz<\/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;\">Wczytaj przyk\u0142ad<\/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\":\"Po\u0142\u0105czenie danych w Looker Studio nie dodaje tabel, tylko je \u0142\u0105czy. Je\u015bli prawa strona ma wi\u0119cej ni\u017c jeden wiersz na klucz, ka\u017cdy wiersz z lewej zostaje powielony, a jego miary licz\u0105 si\u0119 wielokrotnie. Poni\u017csze wyliczenie pokazuje to wcze\u015bniej ni\u017c wykres.\",\"h_links\":\"Lewa tabela\",\"h_rechts\":\"Prawa tabela\",\"label_quelle\":\"Nazwa\",\"label_zeilen\":\"Wiersze\",\"label_schluessel\":\"R\u00f3\u017cne warto\u015bci klucza\",\"label_art\":\"Rodzaj po\u0142\u0105czenia\",\"art_links\":\"lewe zewn\u0119trzne\",\"art_innen\":\"wewn\u0119trzne\",\"art_rechts\":\"prawe zewn\u0119trzne\",\"art_voll\":\"pe\u0142ne zewn\u0119trzne\",\"art_kreuz\":\"krzy\u017cowe\",\"label_treffer\":\"Udzia\u0142 kluczy z lewej wyst\u0119puj\u0105cych po prawej, w procentach\",\"label_kennzahl\":\"Miara lewej tabeli (suma)\",\"label_felder\":\"Pola \u0142\u0105czenia\",\"knopf\":\"Przelicz\",\"beispiel\":\"Wczytaj przyk\u0142ad\",\"fehler_zeilen\":\"Obie liczby wierszy musz\u0105 by\u0107 liczbami ca\u0142kowitymi wi\u0119kszymi od zera.\",\"fehler_schluessel\":\"Obie liczby kluczy musz\u0105 by\u0107 liczbami ca\u0142kowitymi wi\u0119kszymi od zera.\",\"fehler_mehr_schluessel\":\"Tabela nie mo\u017ce mie\u0107 wi\u0119cej r\u00f3\u017cnych kluczy ni\u017c wierszy.\",\"fehler_treffer\":\"Udzia\u0142 musi mie\u015bci\u0107 si\u0119 w zakresie od 0 do 100.\",\"fehler_kennzahl\":\"Miara musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"h_ergebnis\":\"Co daje po\u0142\u0105czenie\",\"h_befunde\":\"Ustalenia\",\"h_formel\":\"Pole dla czystego klucza\",\"h_pruefliste\":\"Zanim po\u0142\u0105czenie wejdzie do u\u017cytku\",\"z_links_je\":\"Wiersze na klucz po lewej\",\"z_rechts_je\":\"Wiersze na klucz po prawej\",\"z_passend\":\"Klucze z trafieniem\",\"z_zeilen\":\"Wiersze po po\u0142\u0105czeniu\",\"z_kennzahl_vorher\":\"Miara przed po\u0142\u0105czeniem\",\"z_kennzahl_nachher\":\"Miara po po\u0142\u0105czeniu\",\"z_faktor\":\"Mno\u017cnik zawy\u017cenia\",\"formel_erklaerung\":\"Klucze rzadko pasuj\u0105 same z siebie: wystarczy jedna spacja albo wielka litera, aby si\u0119 rozjecha\u0142y. Pole obliczeniowe po obu stronach sprowadza je do wsp\u00f3lnej postaci.\",\"b_kreuz\":\"Po\u0142\u0105czenie krzy\u017cowe \u0142\u0105czy ka\u017cdy wiersz z ka\u017cdym. Raport prawie nigdy tego nie potrzebuje, a rozmiar szybko wymyka si\u0119 spod kontroli.\",\"b_vervielfacht\":\"Prawa tabela ma %s wierszy na klucz, wi\u0119c ka\u017cdy wiersz z lewej pojawia si\u0119 %n razy, a jego miary tyle samo razy si\u0119 licz\u0105.\",\"b_beidseitig\":\"Obie strony maj\u0105 po kilka wierszy na klucz. Wynik ro\u015bnie jak iloczyn obu, to klasyczny przypadek rozjazdu.\",\"b_sauber\":\"Po obu stronach jeden wiersz na klucz: to po\u0142\u0105czenie dok\u0142ada kolumny, nie mno\u017c\u0105c wierszy.\",\"b_innen_verliert\":\"Po\u0142\u0105czenie wewn\u0119trzne odrzuca wiersze bez pary - z raportu znika oko\u0142o %s wierszy lewej tabeli.\",\"b_links_leer\":\"Wiersze z lewej bez pary zostaj\u0105, ale ich kolumny z prawej pozostaj\u0105 puste i na wykresie wida\u0107 null.\",\"b_wenig_treffer\":\"Pasuje tylko %s procent kluczy. Zwykle stoi za tym inaczej zbudowany klucz, a nie brakuj\u0105ce dane.\",\"b_mehrere_felder\":\"%s pola \u0142\u0105czenia: wszystkie musz\u0105 si\u0119 dok\u0142adnie zgadza\u0107, a ka\u017cde kolejne obni\u017ca liczb\u0119 trafie\u0144.\",\"b_ohne_feld\":\"Nie podano pola \u0142\u0105czenia. Bez klucza po\u0142\u0105czenie nie ma si\u0119 o co oprze\u0107.\",\"l_datum\":\"Zakres dat po\u0142\u0105czenia wynika z pierwszej tabeli. Drugie pole daty obok tworzy luki wygl\u0105daj\u0105ce jak brakuj\u0105ce dane.\",\"l_granular\":\"Po\u0142\u0105czenia \u0142\u0105cz\u0105 dane ju\u017c zagregowane. Obie strony musz\u0105 by\u0107 wcze\u015bniej sprowadzone do tej samej ziarnisto\u015bci, inaczej klucz nigdy nie trafi.\",\"l_kennzahl\":\"Miar z prawej tabeli nie da si\u0119 potem zagregowa\u0107 od nowa. Co przyjdzie zwielokrotnione, zwielokrotnione zostanie.\",\"l_reihenfolge\":\"Kolejno\u015b\u0107 tabel rozstrzyga o wyniku: zamiana lewej i prawej zmienia po\u0142\u0105czenie lewe w zupe\u0142nie inny raport.\",\"l_gegenprobe\":\"Kontrola, kt\u00f3ra kosztuje minut\u0119: por\u00f3wna\u0107 sum\u0119 jednej miary przed po\u0142\u0105czeniem i po nim. Je\u015bli uros\u0142a, po\u0142\u0105czenie powieli\u0142o wiersze.\"};<\/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>Wylicza, ile wierszy powstaje z po\u0142\u0105czenia danych i jakim mno\u017cnikiem zawy\u017cana jest miara z lewej tabeli, zanim liczby trafi\u0105 na wykres.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92097,92100],"class_list":["post-10249","page","type-page","status-publish","hentry","tag-data-quality-pl","tag-google-analytics-4-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Planer po\u0142\u0105cze\u0144 danych w Looker Studio - 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\/pl\/narzedzia\/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=\"Planer po\u0142\u0105cze\u0144 danych w Looker Studio - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wylicza, ile wierszy powstaje z po\u0142\u0105czenia danych i jakim mno\u017cnikiem zawy\u017cana jest miara z lewej tabeli, zanim liczby trafi\u0105 na wykres.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/looker-studio-blend-join-planner\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/looker-studio-blend-join-planner\\\/\",\"name\":\"Planer po\u0142\u0105cze\u0144 danych w Looker Studio - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:34:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/looker-studio-blend-join-planner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/looker-studio-blend-join-planner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/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\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Planer po\u0142\u0105cze\u0144 danych w Looker Studio\"}]},{\"@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":"Planer po\u0142\u0105cze\u0144 danych w Looker Studio - 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\/pl\/narzedzia\/looker-studio-blend-join-planner\/","og_locale":"en_US","og_type":"article","og_title":"Planer po\u0142\u0105cze\u0144 danych w Looker Studio - Lukas Wojcik - Blog","og_description":"Wylicza, ile wierszy powstaje z po\u0142\u0105czenia danych i jakim mno\u017cnikiem zawy\u017cana jest miara z lewej tabeli, zanim liczby trafi\u0105 na wykres.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/looker-studio-blend-join-planner\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/looker-studio-blend-join-planner\/","name":"Planer po\u0142\u0105cze\u0144 danych w Looker Studio - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:34:11+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/looker-studio-blend-join-planner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/looker-studio-blend-join-planner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/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\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Planer po\u0142\u0105cze\u0144 danych w Looker Studio"}]},{"@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\/10249","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=10249"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10249\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10249"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}