问题描述
我搜索了类似的问题,但最相似的是这个(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