zoukankan      html  css  js  c++  java
  • 解决loops与synthetic keys的问题

    1. 重命名字段防止字段关联。

    2. Concatenation(串联)

    Store:
    Load * Inline [
        StoreID, StoreName
        1, Store A
        2, Store B
    ];
    
    Calendar:
    Load MonthID As DateID, Month Inline [
        MonthID, Month
        1, Jan
        2, Feb
    ];
    
    Product:
    Load * Inline [
        ProductID, Product
        1, Product A
        2, Product B
    ];
    
    Sales:
    LOAD * INLINE [
        DateID, StoreID, ProductID, SaleQty, SaleValue
        1, 1, 1, 2, 23
        1, 1, 2, 4, 24
        2, 1, 1, 4, 33
        2, 1, 2, 3, 28
        1, 2, 1, 2, 21
        1, 2, 2, 4, 30
        2, 2, 1, 3, 25
    ];
    
    Waste:
    LOAD * INLINE [
        DateID, StoreID, ProductID, WasteQty, WasteValue
        1, 1, 1, 1, 10
        2, 1, 2, 1, 9
        1, 2, 2, 2, 17
        2, 2, 2, 1, 8 
    ];

    qlikview为我们自动产生了一个synthetic key,可以看出Sales和Waste共享同样的key set(StoreID,DateID,ProductID),这种情况我们就可以通过concatenate去消除此key set。

    修改waste表的加载方式如下:

    //Waste:
    Concatenate (Sales)
    LOAD * INLINE [
        DateID, StoreID, ProductID, WasteQty, WasteValue
        1, 1, 1, 1, 10
        2, 1, 2, 1, 9
        1, 2, 2, 2, 17
        2, 2, 2, 1, 8
    ];

    这个时候synthetic key消失了。

    注意:

    1. 当两个事实表共享同样的相同个数的(key set)键集合的时候,concatenation应该是首选方案去避免qlikview自动的创建synthetic key.

    2. concatenate 相当于把两个小表合并成一个大表,此大表包含2个表的所有子段列,和所有的行信息。同时做了横向和纵向的扩展。

    3. QIikview 在做计算的时候是直接忽略null值的。即在qlikview的表达式里存在NULL的行做运算的时候,qlikview直接忽略它,其他的非NULL的值可以做运算。但是在SQL SERVER里如果有NULL的参与运算的时候,结果肯定是NULL。

    3. LinkTable

    Store:
    Load * Inline [
        StoreID, StoreName
        1, Store A
        2, Store B
    ];
    
    Calendar:
    Load MonthID As DateID, Month Inline [
        MonthID, Month
        1, Jan
        2, Feb
    ];
    
    Product:
    Load * Inline [
        ProductID, Product
        1, Product A
        2, Product B
    ];
    
    Sales:
    LOAD * INLINE [
        DateID, StoreID, ProductID, SaleQty, SaleValue
        1, 1, 1, 2, 23
        1, 1, 2, 4, 24
        2, 1, 1, 4, 33
        2, 1, 2, 3, 28
        1, 2, 1, 2, 21
        1, 2, 2, 4, 30
        2, 2, 1, 3, 25
    ];
    
    Budget:
    LOAD * INLINE [
        StoreID, ProductID, BudgetQty, BudgetValue
        1, 1, 5, 50
        1, 2, 6, 47
        2, 1, 5, 41
        2, 2, 4, 27
    ];

    Budget和Sales两个表同时共享一个$Syn1,但是Sales事实表比Budget事实表多一个key named DateID. 所以这种情况下用concatenate不太适合。

    第一步:为Sales和Budget表创建一个键字段 (key filed),它包含两个表的共同的键字段。

    Sales:
    LOAD
    AutoNumberHash256(StoreID, ProductID) As SalesBudgetID,
    *
    INLINE [
    DateID, StoreID, ProductID, SaleQty, SaleValue
    1, 1, 1, 2, 23
    1, 1, 2, 4, 24
    2, 1, 1, 4, 33
    2, 1, 2, 3, 28
    1, 2, 1, 2, 21
    1, 2, 2, 4, 30
    2, 2, 1, 3, 25
    ];

    Budget:
    LOAD
    AutoNumberHash256(StoreID, ProductID) As SalesBudgetID,
    *
    INLINE [
    StoreID, ProductID, BudgetQty, BudgetValue
    1, 1, 5, 50
    1, 2, 6, 47
    2, 1, 5, 41
    2, 2, 4, 27
    ];

    第二步:通过Sales表的数据创建一个key table。

    Key:
    Load Distinct
    SalesBudgetID,
    StoreID,
    ProductID
    Resident
    Sales;

    第三步: 和Budget表所有匹配的记录进行连接Join。

    Join (Key)
    Load Distinct
    SalesBudgetID,
    StoreID,
    ProductID
    Resident
    Budget;

    第四步:删除Sales和Budget表里的已经在Key Table里的字段。

    Drop Fields StoreID, ProductID From Sales;
    Drop Fields StoreID, ProductID From Budget;

  • 相关阅读:
    PAT-乙级-1008 数组元素循环右移问题
    PAT-乙级-1007 素数对猜想
    PAT-乙级-1006 换个格式输出整数
    PAT-乙级-1005 继续(3n+1)猜想
    PAT-乙级-1003 我要通过!
    PAT-乙级-1004 成绩排名
    PAT-乙级-1002 写出这个数
    PAT-乙级-1001 害死人不偿命的(3n+1)猜想
    PAT-甲级-1002-A+B for Polynomials
    【windows】共享文件夹设置
  • 原文地址:https://www.cnblogs.com/olapforever/p/5230481.html
Copyright © 2011-2022 走看看