首页 > 解决方案 > SQL Server 2012 - 我尝试使用 2 列数据透视,但 SUM 函数没有给出预期结果

问题描述

我搜索了类似的问题,但最相似的是这个(使用 PIVOT 时在 SQL Server 2012 中未获得正确的 SUM 值),但条件略有不同,所以我将提出新问题

我想对 2 列进行透视查询,一列是货币类型,另一列是日期。这是示例数据:

| idTransaction | txtCashOutput | cashOutput | txtDateOutput | dateOutput |
| ------------- | ------------- | ---------- | ------------- | ---------- |
|           101 |        cash_1 |       2000 |        date_1 | 2020-01-01 |
|           101 |        cash_1 |       2000 |        date_1 | 2020-02-01 |
|           101 |        cash_2 |       1000 |        date_2 | 2020-03-01 |
|           101 |        cash_2 |       1200 |        date_2 | 2020-04-01 |
|           101 |        cash_3 |       1500 |        date_3 | 2020-05-01 |

我故意使用这些“txt”表来帮助我设置 2 列数据透视表。我忘记了如何使用动态多个枢轴。

这是我的查询:

select 
    idTransaction,
    cash_1 = sum(cash_1), date_1 = max(date_1),
    cash_2 = sum(cash_2), date_2 = max(date_2),
    cash_3 = sum(cash_3), date_3 = max(date_3)
from (
    select 
        idTransaction,
        txtCashOutput,
        cashOutput,
        txtDateOutput,
        dateOutput
    from Table01
) src
pivot ( 
    sum(cashOutput) FOR txtCashOutput IN (cash_1,cash_2,cash_3)  
) AS piv1
pivot (
    max(dateOutput) FOR txtDateOutput IN (date_1,date_2,date_3)
) as piv2

group by
    idTransaction

预期结果:

| idTransaction | cash_1 |     date_1 | cash_2 |     date_2 | cash_3 |     date_3 |
| ------------- | ------ | ---------- | ------ | ---------- | ------ | ---------- |
|           101 |   4000 | 2020-02-01 |   2200 | 2020-04-01 |   1500 | 2020-05-01 |

但我得到了这个:

| idTransaction | cash_1 |     date_1 | cash_2 |     date_2 | cash_3 |     date_3 |
| ------------- | ------ | ---------- | ------ | ---------- | ------ | ---------- |
|           101 |   2000 | 2020-02-01 |   2200 | 2020-04-01 |   1500 | 2020-05-01 |

cash_1 的 SUM 结果不是加法,而是它的不同值,而 cash_2 的 SUM 结果是正确的。我有点困惑为什么如果值不同,SUM 结果是正确的,但如果值相同,SUM 结果不正确。

我上面提到的问题是他们需要显示一列的 SUM 结果,同时制作另一列的枢轴,所以我想这与我的有点不同。

我希望这已经足够清楚了。

任何帮助将不胜感激。

谢谢!

标签: sql-serversumpivotdistinct

解决方案


CASE使用带有表达式的条件聚合更容易做到这一点

SELECT idTransaction,
       MAX (CASE WHEN txtCashOutput = 'cash_1' THEN cashOutput END ) AS cash_1, 
       MAX (CASE WHEN txtDateOutput = 'date_1' THEN dateOutput END ) AS date_1 
       MAX (CASE WHEN txtCashOutput = 'cash_2' THEN cashOutput END ) AS cash_2, 
       MAX (CASE WHEN txtDateOutput = 'date_2' THEN dateOutput END ) AS date_2,
       . . .  
FROM   Table01
GROUP BY idTransaction 

推荐阅读