2012-05-29 83 views
4

我的查询是:SQL服务器行

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 

感谢,

+0

可能重复的[SQL Server动态PIVOT查询?](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – RichardTheKiwi

回答

8

您将需要使用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:

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) 

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

+0

谢谢bluefeet。有用。 :) – riz