将数据加载到 Qlik Sense 并避免循环引用和合成键的问题

问题描述 投票:0回答:1

我在将数据加载到 Qlik Sense 并避免循环引用和合成键时遇到问题。我已经尝试了下面提供的脚本,但它没有按预期工作。如果有人能帮助我解决这个问题,我将不胜感激。

这是我正在使用的脚本:

Cities:
LOAD
    City,
    "City Code",
    Region,
    Latitude,
    Longitude,
    "Desc"
FROM [lib://Esercizio-1/Cities.xlsx]
(ooxml, embedded labels, table is Cities);

Customers:
LOAD
    Customer,
    "Customer Number",
    "City Code"
FROM [lib://Esercizio-1/Customers.xlsx]
(ooxml, embedded labels, table is Customer);


Items:
LOAD
    "Item Number",
    "Product Group",
    "Product Line",
    "Product Sub Group",
    "Product Type"
FROM [lib://Esercizio-1/Item master.xlsx]
(ooxml, embedded labels, table is [Item master]);



Sales:
LOAD
    "%KEY",
    Cost,
    "Customer Number",
    "Date" ,
    
    Date(Year(Date),Month(Date),Day(Date)) as DateKey,
    Day(Date) As Day,
    Month(Date) as Month,
    Month(Date) as MonthNbr,
    Week(Date) as Week,
    Ceil(Month(Date)/3) as Quarter,
    Year(Date) as Year,
    Year(Date) & Month(Date) as YearMonthNbr,
    Year(Date) & '-' & Month(Date) as YearMonth,

    GrossSales,
    "Invoice Date",
    "Invoice Number",
    "Item Desc",
    "Item Number",
    Margin,
    "Order Number",
    "Promised Delivery Date",
    Sales,
    "Sales Qty",
    "Sales Rep Number" as  "Sales Rep ID"
FROM [lib://Esercizio-1/Sales.xlsx]
(ooxml, embedded labels, table is Sales);


Manager:
LOAD
    Manager,
    "Manager Number",
    Path,
    "Sales Rep Name",
    "Sales Rep Name1",
    "Sales Rep Name2",
    "Sales Rep Name3",
    "Sales Rep ID"
FROM [lib://Esercizio-1/Sales rep.csv]
(txt, codepage is 28599, embedded labels, delimiter is ';', msq);

BudgetTable:
LOAD 
     "Product Type",
     Year,
     Region ,
     Budget
FROM [lib://Esercizio-2/Budget.xlsx]
(ooxml, embedded labels, table is Budget);

我想知道如何在加载 BudgetTable 时避免循环引用和合成键。

提前感谢您的帮助!

business-intelligence qlikview qliksense
1个回答
0
投票

这里确实有一些循环引用:

你应该在这里决定的是如何处理预算表引入的混合粒度。请参阅 Henric Cronstrom 撰写的关于这个确切问题的精彩文章。他有另一个在这里类似地讨论何时将表格连接在一起。

这不是一件超级容易解决的事情,因为有很多与数据模型相关的“陷阱”,但我认为这样的事情可能是一个起点:

制作复合键

使用表的公共字段(与任何其他表共享的字段)在每个表中创建一个复合键。我们可以使用

AutoNumber()
函数轻松实现:

Cities:
Load *
  , AutoNumber( "Region"    & '|' &
                "City Code"
            ) as "_key_cities"
;
Load
    City,
    "City Code",
    Region,
    Latitude,
    Longitude,
    "Desc"
FROM [lib://Esercizio-1/Cities.xlsx]
(ooxml, embedded labels, table is Cities);


Customers:
Load *
  , AutoNumber( "Customer Number"   & '|' &
                "City Code"
            ) as "_key_customers"
;
Load
    Customer,
    "Customer Number",
    "City Code"
FROM [lib://Esercizio-1/Customers.xlsx]
(ooxml, embedded labels, table is Customer);


Items:
Load *
  , AutoNumber( "Item Number"   & '|' &
                "Product Type"
            ) as "_key_items"
;
Load
    "Item Number",
    "Product Group",
    "Product Line",
    "Product Sub Group",
    "Product Type"
FROM [lib://Esercizio-1/Item master.xlsx]
(ooxml, embedded labels, table is "Item master");


Manager:
LOAD
    Manager,
    "Manager Number",
    Path,
    "Sales Rep Name",
    "Sales Rep Name1",
    "Sales Rep Name2",
    "Sales Rep Name3",
    "Sales Rep ID"
FROM [lib://Esercizio-1/Sales rep.csv]
(txt, codepage is 28599, embedded labels, delimiter is ';', msq);


Sales:
Load *
  , AutoNumber( "Year"              & '|' &
                "Item Number"       & '|' &
                "Customer Number"
            ) as "_key_sales"
;
Load
    "%KEY",
    Cost,
    "Customer Number",
    "Date" ,
    
    DateKey,
    Day,
    Month,
    MonthNbr,
    Week,
    Quarter,
    Year,
    YearMonthNbr,
    YearMonth,

    GrossSales,
    "Invoice Date",
    "Invoice Number",
    "Item Desc",
    "Item Number",
    Margin,
    "Order Number",
    "Promised Delivery Date",
    Sales,
    "Sales Qty",
    "Sales Rep ID"
FROM [lib://Esercizio-1/Sales.xlsx]
(ooxml, embedded labels, table is Sales);


BudgetTable:
Load *
  , AutoNumber( "Product Type"  & '|' &
                "Year"          & '|' &
                "Region"
            ) as "_key_budget"
;
Load
     "Product Type",
     Year,
     Region,
     Budget
FROM [lib://Esercizio-2/Budget.xlsx]
(ooxml, embedded labels, table is Budget);

创建链接表

现在我们可以创建一个“链接”表,这将允许我们将维度表和事实表link在一起。我们可以通过将每个表中的公共字段和关键字段连接到这个新的链接表中,然后将公共字段从原始表中删除来实现这一点(因为它们现在只在一个地方需要并且会关联回原始表表):

[Link table]:
Load Distinct 
    [_key_sales]
  , [Year]
  , [Item Number]
  , [Customer Number]
Resident [Sales];

Drop Fields
    [Year]
  , [Item Number]
  , [Customer Number]
From [Sales];


Join ([Link table])
Load Distinct
    [_key_customers]
  , [Customer Number]
  , [City Code]
Resident [Customers];

Drop Fields
    [Customer Number]
  , [City Code]
From [Customers];


Join ([Link table])
Load Distinct
    [_key_items]
  , [Item Number]
  , [Product Type]
Resident [Items];

Drop Fields
    [Item Number]
  , [Product Type]
From [Items];


Join ([Link table])
Load Distinct
    [_key_cities]
  , [Region]
  , [City Code]
Resident [Cities];

Drop Fields
    [Region]
  , [City Code]
From [Cities];


Join ([Link table])
Load Distinct
    [_key_budget]
  , [Product Type]
  , [Year]
  , [Region]
Resident [BudgetTable];

Drop Fields
    [Product Type]
  , [Year]
  , [Region]
From [BudgetTable];

那应该给我们这样的东西:

重要提示

重要的是要注意我上面的例子代表一个基本的例子并且使用完全随机的数据,因为我没有你的任何实际数据。因此,您可能需要对该脚本进行一些调整才能使其正常工作。

您需要做出的决定之一是是否简单地将预算表连接到销售表中——这是您可以处理此问题的方法之一,但可能会大大扩展该表的大小并使您的计算不稳定,直到你调整它们。

© www.soinside.com 2019 - 2024. All rights reserved.