Cvičení – kombinování výsledků tabulky pomocí operátoru join
V tomto cvičení se naučíte používat join
operátor. Vzpomeňte si, že join
operátor sloučí řádky dvou tabulek odpovídajícími hodnotami zadaných sloupců z každé tabulky.
Výsledky operátora join
použijeme k zodpovězení otázek týkajících se prodeje.
Použití operátoru join
V našem scénáři maloobchodní společnosti vás váš tým žádá, abyste vypsali tři země/oblasti, které mají nejvíce prodejů.
Při kontrole tabulky SalesFact si všimnete, že údaje, které potřebujete, jsou k dispozici ve sloupci SalesAmount , ale tabulka neobsahuje žádná data země/oblasti. Při zkoumání ostatních tabulek si všimnete, že data země/oblasti jsou k dispozici ve sloupci RegionCountryName v tabulce Zákazníci . Všimněte si také, že obě tabulky mají sloupec CustomerKey .
Vzhledem k tomu, že jsou data rozložená do dvou tabulek, potřebujete data zákazníků i prodejní data k zápisu dotazu, který poskytuje požadované informace. K zápisu dotazu použijete join
operátor a sloupec CustomerKey k porovnání řádků z obou tabulek.
Teď jste připraveni napsat dotaz. Pomocí vnitřního join
objektu získáte všechny odpovídající řádky z obou tabulek. Pro zajištění nejlepšího výkonu použijte tabulku dimenzí zákazníků jako levou tabulku a tabulku faktů prodeje jako pravou tabulku.
V následujícím postupu vytvoříte dotaz ve fázích, abyste lépe porozuměli výsledku použití operátoru join
.
Spuštěním následujícího dotazu získejte z tabulky Customers a SalesFact 10 odpovídajících libovolných řádků.
Customers | join kind=inner SalesFact on CustomerKey | take 10
Podívejte se na výsledný seznam. Všimněte si, že tabulka obsahuje sloupce z tabulky Customers a odpovídající sloupce z tabulky SalesFact .
Spuštěním následujícího dotazu shrňte spojené tabulky, abyste získali tři země a oblasti, které mají nejvíce prodejů.
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by RegionCountryName | top 3 by TotalAmount
Výsledky by měly vypadat jako na následujícím obrázku:
Podívejte se na výsledný seznam. Zkuste dotaz upravit tak, aby zobrazoval také odpovídající celkové náklady a zisk pro tyto země nebo oblasti.
Váš tým vás pak požádá o identifikaci zemí/oblastí s nejnižšími výnosy za poslední zaznamenaný rok podle měsíce. K získání těchto dat použijete podobný dotaz. Tentokrát ale funkci použijete startofmonth()
k usnadnění seskupování podle měsíců. Agregační funkci také použijete arg_min()
k vyhledání zemí a oblastí s nejnižšími výnosy za každý měsíc.
Spusťte následující dotaz.
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by Month = startofmonth(DateKey), RegionCountryName | summarize arg_min(TotalAmount, RegionCountryName) by Month | top 12 by Month desc
Výsledky by měly vypadat jako na následujícím obrázku:
Podívejte se na každý řádek. Všimněte si, že první sloupec zobrazuje měsíce posledního roku v sestupném pořadí následované sloupci, které zobrazují celkový prodej pro zemi/oblast s nejnižšími čísly prodeje v daném měsíci.
Použití typu rightouter join
Váš prodejní tým chce znát celkový prodej podle kategorie produktů. Když začnete kontrolovat dostupná data, zjistíte, že k získání dat o prodeji potřebujete tabulku Produkty , abyste získali seznam kategorií produktů a tabulku SalesFact . Uvědomujete si také, že chcete spočítat prodeje pro každou kategorii a zobrazit seznam všech kategorií produktů.
Po analýze požadavku se rozhodnete použít pravé číslo join
, protože vrátí všechny záznamy o prodeji z správné tabulky, obohacené o odpovídající kategorii produktů z levé tabulky. Dotaz napíšete pomocí tabulky Products jako tabulky levé dimenze, odpovídajících dat z tabulky faktů SalesFact a seskupíte výsledek podle kategorie produktu.
Spusťte následující dotaz.
Products | join kind=rightouter SalesFact on ProductKey | summarize TotalSales = count() by ProductCategoryName | order by TotalSales desc
Výsledky by měly vypadat jako na následujícím obrázku:
Všimněte si, že doba provádění je 0,834 sekund, i když se tato doba může mezi spuštěními lišit. Tento dotaz je jedním ze způsobů, jak získat tuto odpověď a je dobrým příkladem dotazu, který není optimalizovaný pro výkon. Později můžete tento čas porovnat s časem provádění ekvivalentního dotazu pomocí operátoru
lookup
, který je optimalizovaný pro tento typ dat.
Použití typu rightanti join
Podobně chce váš prodejní tým zjistit počet produktů, které neprodávají v každé kategorii produktů. Pomocí funkce rightanti můžete získat všechny řádky z tabulky Produkty, které neodpovídají žádným řádkům v tabulce SalesFacts, a pak seskupit výsledky podle kategorie produktů. join
Spusťte následující dotaz.
SalesFact | join kind=rightanti Products on ProductKey | summarize Count = count() by ProductCategoryName | order by Count desc
Výsledky by měly vypadat jako na následujícím obrázku:
Podívejte se na každý řádek. Výsledky zobrazují počet nevydaných produktů na kategorii produktů. Všimněte si, že rightanti
join
vybere pouze produkty, které nemají žádná prodejní fakta, což znamená, že pro produkty vrácené operátoremjoin
nebyly žádné prodeje.