如何选择多列并按一列分组

Posted

技术标签:

【中文标题】如何选择多列并按一列分组【英文标题】:How to select multiple columns and group by one column 【发布时间】:2020-08-05 16:13:26 【问题描述】:

我想根据 number 列对 C.AMOUNT 求和。例如number列在相同的4个数字中,那么我想根据number列中的相同数字对列C.AMOUNT求和,并在FINAL_AMOUNT列中显示求和列

    SELECT A.NUMBER, 
       B.AGE, 
       C.PRODUCT_NAME, 
       SUM(C.AMOUNT) AS FINAL_AMOUNT, 
       (CASE
            WHEN C.PRODUCT_NAME LIKE '%D%'
            THEN 'Y'
            ELSE 'N'
        END) AS D, 
       (CASE
            WHEN C.PRODUCT_NAME LIKE '%E%'
            THEN 'Y'
            ELSE 'N'
        END) AS E, 
       (CASE
            WHEN C.PRODUCT_NAME LIKE '%F%'
            THEN 'Y'
            ELSE 'N'
        END) AS F, 
       (CASE
            WHEN C.PRODUCT_NAME LIKE '%G%'
                 OR C.PRODUCT_NAME LIKE '%H%'
                 OR C.PRODUCT_NAME LIKE '%J%'
            THEN 'Y'
            ELSE 'N'
        END) AS J
FROM [A].[DBO].[A]
     LEFT JOIN [B].[DBO].[B] B ON A.NUMBER = B.NUMBER
     LEFT JOIN [C].[DBO].[C] C ON A.NUMBER = C.NUMBER
WHERE B.REPORT_DATE = '20200728'
GROUP BY A.NUMBER;

这是我使用的查询,但我发现这样的错误:

消息 8120,级别 16,状态 1,行 1 列“B.DBO.B”在 选择列表,因为它不包含在任一聚合中 函数或 GROUP BY 子句。

【问题讨论】:

我删除了 mysql 标签,因为它看起来像是在使用 SQL Server。它们不一样。 【参考方案1】:

看起来您想要的是窗口总和而不是聚合。

即替换:

SUM(C.amount) as FINAL_AMOUNT

与:

SUM(C.amount) OVER(PARTITION BY A.NUMBER) as FINAL_AMOUNT

因此,您需要从查询中删除GROUP BY 子句。

【讨论】:

以上是关于如何选择多列并按一列分组的主要内容,如果未能解决你的问题,请参考以下文章

Hive Query 在 Select 中具有多列并按一列分组

如何比较按一列分组的 SQL 中的列值?

如何按多列分组以在熊猫数据框中列出

如何按一列分组并对另一列的值进行排序?

如何在此 DataTable 上按一列分组

如何在 SQL 中按多列分组并按日期排序?