SQL Server 2012 - 我尝试使用 2 列数据透视,但 SUM 函数没有给出预期的结果

问题描述

搜索了类似的问题,但最相似的是这个(Not getting the correct SUM values in SQL Server 2012 when using a PIVOT),但条件仍然略有不同,所以我只会提出新问题

我想对 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 结果,同时制作另一列的枢轴,所以我想这和我的有点不同。

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

任何帮助将不胜感激。

谢谢!

解决方法

使用带有 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