SQL Server 行到列

标签 sql sql-server pivot

我的查询是:

SELECT vendor.id, insurances.id AS ins_id, vendor_insurances.expiry_date
FROM vendor
INNER JOIN vendor_insurances
ON vendor.id=vendor_insurances.vendor_id

和输出:

id    ins_id    expiry_date
================================
28    1         2006-01-01
28    11        2008-01-01

我想将其转换为:

id    1            11
======================================
28    2006-01-01   2008-01-01

谢谢

最佳答案

您将需要使用PIVOT并做类似的事情:

静态透视 - 仅适用于您将透视的少数列

select *
from 
(
  SELECT v.id
    , vi.id AS ins_id
    , vi.expiry_date
  FROM vendor v
  INNER JOIN vendor_insurances vi
    ON v.id=vi.vendorId
) x
PIVOT
(
   MIN(expiry_date)
    FOR ins_id IN ([1], [11])
) p

参见SQL Fiddle用于工作演示

或者,如果您有很多要进行 PIVOT 的项目,则可以使用动态 Pivot:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(vi.id) 
                  FROM vendor v
                  INNER JOIN vendor_insurances vi
                    ON v.id=vi.vendorId
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from 
             (
                SELECT v.id
                    , vi.id AS ins_id
                    , vi.expiry_date
                FROM vendor v
                INNER JOIN vendor_insurances vi
                    ON v.id=vi.vendorId
            ) x
            pivot 
            (
                MIN(expiry_date)
                for ins_id in (' + @cols + ')
            ) p '

execute(@query)

两者都会给你相同的结果。

关于SQL Server 行到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806302/

相关文章:

mysql - 需要帮助通过 SQL 查询确定输出的优先级

php - Mysql-PHP,基于变量字段的旋转/交叉表

sql - Oracle SQL 错误 : ORA-00923: From Keyword not found where expected

sql - 如果同一表中存在特定记录,则设置列值

sql - 如何从 bash 脚本中执行 SQL?

SQL查询按年按月统计事件

sql-server - MS SQL 2008 - 创建没有数据的数据库副本

sql - 如何将我的查询包含在查询结果中?

sql - 通过旋转将 Presto 列转换为行

python - 在数据透视后对多索引的 pandas 数据帧数据重新排序