1

私は次のような値を持つ次の表を持っています

CREATE TABLE stud 
  ( 
     sname NVARCHAR(10), 
     hr    NVARCHAR(30), 
     dt    DATETIME, 
     att   VARCHAR(3) 
  )

INSERT INTO stud VALUES ('Abi',  '1',  '21/01/2013','a')
INSERT INTO stud VALUES ('Abi',  '2',  '21/01/2013','p')
INSERT INTO stud VALUES ('bala',  '1',  '21/01/2013','p')
INSERT INTO stud VALUES ('bala',  '2',  '21/01/2013','a')
INSERT INTO stud VALUES ('bala',  '1',  '22/01/2013','od')
INSERT INTO stud VALUES ('bala',  '2',  '22/01/2013','ml')
INSERT INTO stud VALUES ('Abi',  '1',  '22/01/2013','ml')
INSERT INTO stud VALUES ('Abi',  '2',  '22/01/2013','od')

このテーブルを選択すると、次のように出力が得られます

SELECT * 
FROM   stud 
sname hr dt att
アビ12013-01-2100:00:00.000 a
アビ22013-01-2100:00:00.000 p
バラ12013-01-2100:00:00.000 p
バラ22013-01-2100:00:00.000 a
バラ12013-01-2200:00:00.000 od
バラ22013-01-2200:00:00.000 ml
アビ12013-01-2200:00:00.000 ml
Abi 2 2013-01-22 00:00:00.000 od

ただし、ASP.NETのCr​​ystal Reportで次のように出力する必要があります(注:日付はfrom_dateからto_dateまで動的に指定する必要があります)

sname 21/01/2013 22/01/2013

長い日からこの出力を試しましたが、出力が得られませんでした。

4

1 に答える 1

3

SQL Server 2005以降を使用している場合、PIVOT関数を適用する方法はいくつかあります。

静的ピボットの形式で値をハードコーディングできます。

select *
from
(
  select sname, 
    'hour_no_'+hr+'_'+convert(nvarchar(10), dt, 120) dt,
    att
  from stud
) st
pivot
(
  max(att)
  for dt in ([hour_no_1_2013-01-21], [hour_no_2_2013-01-21],
             [hour_no_1_2013-01-22], [hour_no_2_2013-01-22])
) piv

SQL FiddlewithDemoを参照してください

または、動的SQLを使用して、実行時にsqlステートメントを生成できます。クエリの動的バージョンは次のとおりです。

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

select @cols 
  = STUFF((SELECT ', ' + QUOTENAME('Hour_No_'+hr+'_'++convert(nvarchar(10), dt, 120)) 
           from stud
           group by hr, dt
           order by dt, hr
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT sname,' + @cols + ' from 
             (
                select sname, 
                  ''hour_no_''+hr+''_''+convert(nvarchar(10), dt, 120) dt,
                  att
                from stud
            ) x
            pivot 
            (
                max(att)
                for dt in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください。

どちらも結果を出します。

| SNAME | HOUR_NO_1_2013-01-21 | HOUR_NO_2_2013-01-21 | HOUR_NO_1_2013-01-22 | HOUR_NO_2_2013-01-22 |
-----------------------------------------------------------------------------------------------------
|   Abi |                    a |                    p |                   ml |                   od |
|  bala |                    p |                    a |                   od |                   ml |
于 2013-01-25T19:56:26.513 に答える