代码之家  ›  专栏  ›  技术社区  ›  Vaynard

如何汇总相同表上的父数据?

  •  0
  • Vaynard  · 技术社区  · 9 年前

    我有一个Temp表(在存储过程中),比如#tempTable,它包含一个 id,id名称 数量 ,详细信息id(4个字符id)是唯一非NULL的行 数量 价值

    id      id_name  Amount
    1       Main1    NULL
    11      Header1  NULL
    1101    Detail1  2
    1102    Detail2  7  
    12      Header2  NULL
    1201    Detail3  5 
    1202    Detail4  3
    

    我想要的是一个汇总金额的查询,其id嵌套在自己的id中,如:

    amount 11=金额1101+金额1102(因为11在第一个细节的左边两个字符中)

    数量12=数量1201+数量1202(因为12在第一个细节的左字符中)

    amount 1=amount 11+amount 12(因为1在第一个细节的左侧字符中)

    id      id_name  Amount
    1       Main1    17
    11      Header1  9
    1101    Detail1  2
    1102    Detail2  7  
    12      Header2  8
    1201    Detail3  5 
    1202    Detail4  3
    

    我做了什么

    SELECT t.id
    , t.id_name
    , CASE LEN(t.id)
        WHEN 2 
             THEN (SELECT SUM(t2.Amount) FROM #tempTable t2 WHERE LEFT(t2.id,2) = t.id) and LEN(t2.id) > 2)
        WHEN 1 
             THEN (SELECT SUM(t2.Amount) FROM #tempTable t2 WHERE LEFT(t2.id,1) = t.id) and LEN(t2.id) = 2)
        ELSE t1.amount
    END
    FROM #tempTable t
    

    但这让我

    id      id_name  Amount
    1101    Detail1  2
    1102    Detail2  7  
    1201    Detail3  5 
    1202    Detail4  3
    

    我该怎么解决这个问题?

    对不起,我的英语不好,它不是我的母语,也不是第二甚至第三语言:D。。

    使现代化 要回答 Lajos Arpad 议论

    this

    3 回复  |  直到 5 年前
        1
  •  0
  •   sheeni    9 年前

    您可以使用以下脚本来获得所需的结果。主选择中的子选择忽略金额中的NULL值。

    SELECT t.id
    , t.id_name
    , CASE LEN(t.id)
        WHEN 2 
             THEN ISNULL((SELECT SUM(t2.Amount) FROM #tempTable t2 WHERE t2.id = t.id) and LEN(t2.id) = 2),0)
        WHEN 1 
             THEN ISNULL((SELECT SUM(t3.Amount) FROM #tempTable t3 WHERE t3.id= t.id) and LEN(t3.id) = 1),0)
        ELSE ISNULL(t1.amount,0)
    END
    FROM #tempTable t
    
        2
  •  0
  •   Lajos Arpad    9 年前

    让我们像对待一般问题一样来处理这个问题,提出特定的问题,并在每个步骤中进行归纳,直到找到一般答案。首先,我们需要能够找到我们的团队:

    select LEFT(id, 2) AS id_group, Amount
    from #tempTable;
    

    select id_group, sum(Amount) as amnt
    from (select LEFT(id, 2) AS id_group, Amount
          from #tempTable) t
    group by id_group;
    
        3
  •  0
  •   Jatin Patel    9 年前

    试试这个,

    SELECT t.id
    , t.id_name
    , t1.TotalAmount
    FROM #tempTable t
    OUTER APPLY (   SELECT SUM(t2.Amount) AS TotalAmount 
                    FROM #tempTable t2 
                    WHERE CAST(t2.ID AS VARCHAR(4)) LIKE CAST(t.ID AS VARCHAR(4)) + '%' 
                    ) AS t1
    GROUP BY t.id
        , t.id_name