SQL Server如何同时对数值列与bit类型列执行PIVOT行转列
SQL Server 多列转置实现方案
方案1:使用条件聚合(推荐,灵活性更高)
该方案不需要使用PIVOT语法,通过条件判断即可同时处理不同类型的字段聚合,bit类型字段可使用MAX/MIN聚合函数取值(同日期同国家仅一条数据时,聚合结果等于原字段值)。
SELECT [Date], -- 聚合不同国家的Value SUM(CASE WHEN [Country] = 'ABW' THEN [Value] END) AS [ABW], SUM(CASE WHEN [Country] = 'GBR' THEN [Value] END) AS [GBR], -- 聚合不同国家的Accurate MAX(CASE WHEN [Country] = 'ABW' THEN [Accurate] END) AS [ABW Accurate], MAX(CASE WHEN [Country] = 'GBR' THEN [Accurate] END) AS [GBR Accurate] FROM RawDataTable GROUP BY [Date] ORDER BY [Date]
方案2:使用两次PIVOT关联实现
如果需要保留PIVOT写法,可以分别对Value和Accurate做转置后通过Date字段关联,Accurate转置时使用MAX作为聚合函数即可适配bit类型:
SELECT v.[Date], v.[ABW], v.[GBR], a.[ABW] AS [ABW Accurate], a.[GBR] AS [GBR Accurate] FROM -- 转置Value列 ( SELECT [Date], [Country], [Value] FROM RawDataTable ) val PIVOT ( SUM([Value]) FOR [Country] IN ([ABW], [GBR]) ) v JOIN -- 转置Accurate列 ( SELECT [Date], [Country], [Accurate] FROM RawDataTable ) acc PIVOT ( MAX([Accurate]) FOR [Country] IN ([ABW], [GBR]) ) a ON v.[Date] = a.[Date] ORDER BY v.[Date]
说明
- 原PIVOT语法一次仅支持处理一个聚合列,因此需要转置多个字段时,条件聚合的写法更简洁易维护
- bit类型不能使用SUM等数值聚合函数,但同分组仅一条匹配数据时,
MAX/MIN都可以正确取出原bit值
内容的提问来源于stack exchange,提问作者jamheadart
相关产品推荐
相关产品推荐

