如何选择n列和SUM,而仅按一些非聚合列进行分组?

时间:2018-11-28 03:39:35

标签: sql sql-server

我的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行对数据进行分组

谢谢

3 个答案:

答案 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