【问题标题】:Crosstab query with category totals, tree table structure具有类别总计、树表结构的交叉表查询
【发布时间】:2015-12-02 21:41:39
【问题描述】:

我将如何进行这样的交叉表查询?

        TopItem1 TopItem2 Category1 Ca1Item1 Ca1Item2 Category2 Ca2Sub1 Ca2Sub1It1 Ca2Sub1It2 Ca2Sub2 Ca2Sub2It1
Group1      1        3        6         2        4        4         3       1          2          1       1
Group2      3        1        0         0        0        5         4       2          2          1       1

即每个类别的总和的交叉表查询。

带有列标题的树状结构表是这样的:

tSource

Key  Value       Parent
1    TopItem1
2    TopItem2
3    Category1
4    Category2
5    Ca1Item1    3
6    Ca1Item2    3
7    Ca2Sub1     4
8    Ca2Sub2     4
9    Ca2Sub1It1  7
10   Ca2Sub1It2  7
11   Ca2Sub2It1  8

具有要计算的行标题和值的表是您所期望的。

现在我知道创建一个适用于任何深度树的查询是完全不可能的,但是如果我只有 3 个像所示的级别,我如何获得一个交叉表查询来显示类别总数?

【问题讨论】:

    标签: ms-access crosstab


    【解决方案1】:

    对于相对较浅的“树深度”,您可以使用自联接的 UNION 来匹配子记录与其父母和祖父母的数量。例如,一个名为 [tbl] 的表包含

    Key  Value       Parent  Amount  GroupName
    ---  ----------  ------  ------  ---------
      1  TopItem1                 5  Group1   
      2  TopItem2                 6  Group1   
      3  Category1                7  Group1   
      4  Category2                8  Group1   
      5  Ca1Item1         3      20  Group1   
      6  Ca1Item2         3      40  Group1   
      7  Ca2Sub1          4      60  Group1   
      8  Ca2Sub2          4      80  Group1   
      9  Ca2Sub1It1       7     400  Group1   
     10  Ca2Sub1It2       7     500  Group1   
     11  Ca2Sub2It1       8     600  Group1   
    

    查询

        SELECT t.Value, t.Amount, t.GroupName FROM tbl t
    UNION ALL
        SELECT t2.Value, t1.Amount, t1.GroupName
        FROM 
            tbl t1 
            INNER JOIN 
            tbl t2
                ON t1.Parent = t2.Key
    UNION ALL
        SELECT t3.Value, t1.Amount, t1.GroupName
        FROM
            (
                tbl t1 
                INNER JOIN 
                tbl t2
                    ON t1.Parent = t2.Key
            )
            INNER JOIN 
            tbl t3
                ON t2.Parent = t3.Key
    

    会回来

    • 每个“价值”本身的金额,
    • 每个“值”的子记录的金额,以及
    • 每个“值”的孙记录的金额

    生产

    Value       Amount  GroupName
    ----------  ------  ---------
    TopItem1         5  Group1   
    TopItem2         6  Group1   
    Category1        7  Group1   
    Category2        8  Group1   
    Ca1Item1        20  Group1   
    Ca1Item2        40  Group1   
    Ca2Sub1         60  Group1   
    Ca2Sub2         80  Group1   
    Ca2Sub1It1     400  Group1   
    Ca2Sub1It2     500  Group1   
    Ca2Sub2It1     600  Group1   
    Category1       20  Group1   
    Category1       40  Group1   
    Category2       60  Group1   
    Category2       80  Group1   
    Ca2Sub1        400  Group1   
    Ca2Sub1        500  Group1   
    Ca2Sub2        600  Group1   
    Category2      400  Group1   
    Category2      500  Group1   
    Category2      600  Group1   
    

    如果我们将其包装在交叉表查询中

    TRANSFORM Sum([Amount]) AS whatever
    SELECT [GroupName]
    FROM
        (
                SELECT t.Value, t.Amount, t.GroupName FROM tbl t
            UNION ALL
                SELECT t2.Value, t1.Amount, t1.GroupName
                FROM 
                    tbl t1 
                    INNER JOIN 
                    tbl t2
                        ON t1.Parent = t2.Key
            UNION ALL
                SELECT t3.Value, t1.Amount, t1.GroupName
                FROM
                    (
                        tbl t1 
                        INNER JOIN 
                        tbl t2
                            ON t1.Parent = t2.Key
                    )
                    INNER JOIN 
                    tbl t3
                        ON t2.Parent = t3.Key
        )
    GROUP BY [GroupName]
    PIVOT [Value]
    

    我们得到

    GroupName  Ca1Item1  Ca1Item2  Ca2Sub1  Ca2Sub1It1  Ca2Sub1It2  Ca2Sub2  Ca2Sub2It1  Category1  Category2  TopItem1  TopItem2
    ---------  --------  --------  -------  ----------  ----------  -------  ----------  ---------  ---------  --------  --------
    Group1           20        40      960         400         500      680         600         67       1648         5         6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2012-03-09
      • 2011-01-08
      相关资源
      最近更新 更多