0

我在创建 SQL Server 查询时遇到问题。

总之,查询应该得到 sum 和 count、grouped by 的customerID列,以及另一列,即不用作 grouper 列的列。

我的问题是只对部分语法进行分组,而不需要对列进行分组的情况。

样本数据,测试:

customerID, 1,2,3,4...
InvoiceID, 1234551, 1234552...
ProductID, A, B, C...
Date, Datetime
Income, int
客户ID 发票编号 产品编号 日期 收入
1 1234551 一种 2015 年 1 月 1 日 300
2 1234552 2016 年 2 月 1 日 300

我有一个解决方案,但我确信有一个更简单的解决方案。

SELECT DISTINCT 
    Test.CustomerId,
    ISNULL(TBL.Income_2015, 0) AS Income_2015,
    ISNULL(TBL_2.Income_2016, 0) AS Income_2016,
    CASE 
        WHEN Test.ProductID = 'A' 
            THEN 'TRUE' 
            ELSE 'FALSE' 
    END AS 'purchase_product_A',
    TBL_3.Invoices
FROM
    Test
LEFT OUTER JOIN 
    (SELECT CustomerId, SUM(Income) AS Income_2015 
     FROM Test 
     WHERE YEAR(Date) = 2015 
     GROUP BY CustomerId) TBL ON Test.customerID = TBL.customerID
LEFT OUTER JOIN
    (SELECT CustomerId, SUM(Income) AS Income_2016 
     FROM Test 
     WHERE YEAR(Date) = 2016 
     GROUP BY CustomerId) TBL_2 ON Test.customerID = TBL_2.customerID
LEFT OUTER JOIN
    (SELECT CustomerId, COUNT(InvoiceID) AS Invoices 
     FROM Test 
     GROUP BY CustomerId) TBL_3 ON Test.customerID = TBL_3.customerID

生产:

customerID, 1,2,3...
Income_2015, int
Income_2016, int
Invoices, int
Purchase_product_A, boolean
客户ID 收入_2015 收入_2016 发票 采购_产品_A
1 300 300 2 真的
10 0 400 1 错误的

谢谢!尼尔

4

1 回答 1

3

您可以将条件聚合与单遍查询一起使用:

SELECT
    CustomerId,
    SUM(CASE WHEN YEAR(Date) = 2015 THEN Income ELSE 0 END) AS Income_2015,
    SUM(CASE WHEN YEAR(Date) = 2016 THEN Income ELSE 0 END) AS Income_2016,
    COUNT(InvoiceID) AS Invoices,
    CASE WHEN COUNT(CASE WHEN ProductID = 'A' THEN 1 END) > 0
         THEN 'TRUE' ELSE 'FALSE' END AS [Purchase_product_A]
FROM Test
GROUP BY
    CustomerId;
于 2022-02-20T10:04:04.160 回答