X行数为X列数

时间:2012-10-30 15:39:02

标签: sql-server sql-server-2008 tsql pivot

以下我需要你的帮助。请注意我使用的是SQL SERVER 2008。 我有一张桌子(下图),我们从“Pickup”到“Dropoff”完成了一些工作。 要求是(下面提到的输出格式)。 1)获取所有独特的邮政编码,无论它们是下降或拾取。这将给我们所有的邮政编码。 2)将从PICKUP完成的作业计数呈现给相应的DROPOFF。例如,我们从SE18邮政编码中挑选乘客两次,并将其带到SE18一次,SE19一次。它将从REQUIRED OUTPUT表中清除。

TABLE:
JobID        Pickup       Dropoff
====================================
1            SE18         SE18
2            SE18         SE19
3            SE2          SE18
4            SE28         SE2
5            AL1          SE7
6            BR1          SE10
7            NW1          TW16
8            AL1          SE18
9            BR6          AL1
10           E6           BR1
.            .            .
.            .            .
.            .            .

需求输出如下:

REQUIRED OUTPUT

     SE18   SE2   SE28   AL1   BR1   NW1   BR6   E6   SE19  SE7  SE10  TW16 ..
     =========================================================================
SE18   1     -      -     -     -     -     -     -     1    0    0     0
SE2    1     -      -     -     -     -     -     -     -    -    -     -         
SE28   -     1      -     -     -     -     -     -     -    -    -     -          
AL1    1     -      -     -     -     -     -     -     -    1    -     -       
BR1    -     -      -     -     -     -     -     -     -    -    1     -        
NW1    -     -      -     -     -     -     -     -     -    -    -     1      
BR6    -     -      -     1     -     -     -     -     -    -    -     -       
E6     -     -      -     -     1     -     -     -     -    -    -     -       
SE19   -     -      -     -     -     -     -     -     -    -    -     -        
SE7    -     -      -     -     -     -     -     -     -    -    -     -       
SE10   -     -      -     -     -     -     -     -     -    -    -     -      
TW16   -     -      -     -     -     -     -     -     -    -    -     -      
.
.
.

非常感谢提前。 亲切的问候

1 个答案:

答案 0 :(得分:3)

听起来这就是你要找的东西。如果要对值进行硬编码,则查询将如下所示:

select *
from
(
  select pickup, 
    dropoff,
    dropoff d
  from yourtable
) x
pivot
(
  count(d) 
  for dropoff in ([SE18], [SE2], [SE28], [Al1], [BR1],
              [NW1], [BR6], [E6], [SE19], [SE7],
              [SE10], [TW16])
) p

请参阅SQL Fiddle with Demo

如果你有一个未知数量的值,那么你可以使用动态sql来pivot值:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Dropoff) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT pickup, ' + @cols + ' from 
             (
                select pickup, dropoff, 
                  dropoff as countdropoff
                from yourtable
            ) x
            pivot 
            (
                count(countdropoff)
                for dropoff in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo