首页 > 解决方案 > SQL 透视值列和位列

问题描述

我有一个RawDataTable这样的:

日期 国家 价值 准确的
2000 ABW 4 真的
2001年 ABW 9 真的
2002年 ABW 8 真的
2000 GBR 1 错误的
2001年 GBR 3 真的
2002年 GBR 4 错误的

我在 SQL Server 中旋转它以获得以下格式:

日期 ABW GBR
2000 4 1
2001年 9 3
2002年 8 4

但我也希望Accurate在回报中包含该列,可能会分散,以便每个国家/地区也有自己的Accurate列,如下所示:

日期 ABW GBR ABW 准确 GBR 准确
2000 4 1 真的 错误的
2001年 9 3 真的 真的
2002年 8 4 真的 错误的

到目前为止,我正在使用下面的查询对其进行旋转,但实际上不知道我想要做的事情是否可行,也不知道从哪里开始修改查询:

SELECT * 
FROM 
    (SELECT 
         [Date],
         [Country],
         [Value]
     FROM 
         RawDataTable) CountryVals
PIVOT 
    (SUM([Value])
         FOR [Country] IN ([ABW], [GBR])
    ) AS PivotTable

Accurate在第一列中包括了第四列select。我尝试将另一个枢轴加入到查询的末尾,但这没有用,我尝试在枢轴选择中添加该 col ......实际上我什至无法让枢轴工作,Accurate因为它是一种bit类型而不是decimal例如,所以不确定用什么代替SUM

标签: sqlsql-servertsql

解决方案


我通常发现使用条件表达式来进行简单的旋转会容易得多,您可以轻松地剪切和粘贴重复的列。Pivot只是不直观的语法糖,SQL Server 无论如何都会在内部扩展为 case 表达式。

select date,
    Max(case when country='ABW' then value end) ABW,
    Max(case when country='GBR' then value end) GBR,
    Max(case when country='ABW' then accurate end) ABWAccurate,
    Max(case when country='GBR' then accurate end) GBRAccurate
from t
group by date

推荐阅读