1

下記の件、再度お願い致します。私は SQL SERVER 2008 を使用していることに注意してください。「ピックアップ」から「ドロップオフ」までのジョブ数を取得した表 (以下) があります。要件は次のとおりです(出力形式は後述)。1) ドロップオフまたはピックアップに関係なく、すべての一意の郵便番号を取得します。これにより、すべての郵便番号が得られます。2) PICKUP から対応する DROPOFF に実行されたジョブの数を提示します。たとえば、郵便番号 SE18 から乗客を 2 回ピックアップし、SE18 に 1 回、SE19 に 1 回移動しました。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   -     -      -     -     -     -     -     -     -    -    -     -      
.
.
.

よろしくお願いします。敬具

4

1 に答える 1

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 を参照してください

値の数が不明な場合は、値に対して動的 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 を参照してください

于 2012-10-30T22:12:46.883 に答える