我有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评论
答案 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;