如何在同一个表上汇总父数据?

时间:2016-09-15 06:58:12

标签: sql sql-server sql-server-2008-r2

我有Temp表(在存储过程中)让我们说#tempTable包含 id,id_name 金额,详细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中:

  

金额11 =金额1101 +金额1102(因为11是2个第一个细节'左边的字符)

     

金额12 =金额1201 +金额1202(因为12是第一个细节'左边的字符)

     

     

金额1 =金额11 +金额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
我怎么能解决这个问题?

ps:抱歉我的英语不好,不是我的母语,也不是第二个甚至第三个:D ..

更新 回答Lajos Arpad评论

this

3 个答案:

答案 0 :(得分:0)

您可以使用以下脚本来获得所需的结果。主选择中的子选择忽略金额中的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

答案 1 :(得分:0)

试试这个,

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

答案 2 :(得分:0)

让我们按照一般的方式解决问题,在每个步骤中提出特定问题并概括它们,直到我们找到一般答案。首先,我们需要能够找到我们的小组:

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;