我的SQL基础知识对此可能有些偏离,但我将不胜感激。
问题表明,我正在尝试执行以下操作(不使用Concat(),因为我被困在SQL Server 2008 R2中):
SELECT name, phone, (id1+'-'+id2+'-'+id3) as id
,SUM(CASE WHEN code IN ('00','01','02','03','04','05')
THEN expenses ELSE 0 END) AS sum_expenses
FROM random_table
GROUP BY id1, id2, id3
此查询将引发错误,因为姓名和电话未分组。我正在寻找一种解决方案,可以按费用的总和对总费用进行分组,同时将姓名和电话保留为未汇总的未分组列,因为它们是每个ID行必须保留的必填字段。到目前为止,我还无法在StackOverflow上找到明确的答案。
我在尝试解决此问题时曾考虑过的解决方案,但不确定是否可行(/甚至适用):1)在Select语句中对Sum进行子查询; 2)使用通用表表达式将Sum与主查询分开,3)为id字段和Sum创建一个单独的表,然后使用id作为通用字段将其重新加入。
请注意,在GROUP BY中不包括姓名和电话的原因是我需要按唯一ID行对数据进行分组
谢谢
答案 0 :(得分:0)
group by子句中提到的列在您的输出中将是唯一的。
我建议您看看窗口功能。
例如:
_innerTextbox.TextChanged += _innerTextbox_TextChanged;
答案 1 :(得分:0)
窗口函数,交叉应用,通用表表达式都是可行的选择。
这里是使用通用表表达式并交叉应用的示例。
WITH CTE
AS
(
SELECT
id1,
id2,
id3,
(id1 + '-' + id2 + '-' + id3) AS id,
SUM(CASE WHEN code IN ('00','01','02','03','04','05') THEN expenses ELSE 0 END) AS sum_expenses
FROM random_table
GROUP BY id1, id2, id3
)
SELECT
ca.name,
ca.phone,
cte.id,
cte.sum_expenses
FROM CTE AS cte
CROSS APPLY (
SELECT TOP 1
name,
phone
FROM random_table AS rt
WHERE rt.id1 = cte.id1
AND rt.id2 = cte.id2
AND rt.id3 = cte.id3
) AS ca
答案 2 :(得分:0)
尝试一下...
SELECT name, phone, (id1+'-'+id2+'-'+id3) as id
,SUM(CASE WHEN code IN ('00','01','02','03','04','05')
THEN expenses ELSE 0 END) over (partition by id1, id2, id3) AS sum_expenses
FROM random_table