0

次のデータセットがあるとします。

Name    City           Date
Paul    Milan          04/01/2013
Charls  Rome           04/01/2013
Jim     Tokyo          04/01/2013
Justin  San Francisco  04/01/2013
Bill    London         04/01/2013
Paul    Berlin         05/01/2013
Charls  El Cairo       05/01/2013
Jim     Milan          05/01/2013
Justin  Paris          05/01/2013
Bill    Madrid         05/01/2013

人々がある 日 に[Name]ある 街 を 訪れ た場所.[City][Date]

私たちがやりたいことは、次のよう[Name]に、[City day 1]、を含むテーブルを用意することです。[City day 2]

Name    City 04/01/2013 City 05/01/2013
Paul    Milan           Berlin
Charls  Rome            El Cairo
Jim     Tokyo           Milan
Justin  San Francisco   Paris
Bill    London          Madrid

それを行うためのクエリをどのように書くことができますか?

4

2 に答える 2

2

このタイプのデータ変換は、PIVOT. SQL Server 2005 以降では、このデータ ローテーションを実行できる関数があります。しかし、これはさまざまな方法で行うことができます。

集計関数と を使用して、データCASEピボットできます。

select
  name,
  max(case when date = '2013-04-01' then city end) [City 04/01/2013],
  max(case when date = '2013-05-01' then city end) [City 05/01/2013]
from yourtable
group by name

デモで SQL Fiddle を参照してください

PIVOTまたは、次の関数を使用できます。

select name, [2013-04-01] as [City 04/01/2013], [2013-05-01] as [City 05/01/2013]
from
(
  select name, city, date
  from yourtable
) src
pivot
(
  max(city)
  for date in ([2013-04-01], [2013-05-01])
) piv

SQL Fiddle with Demoを参照してください。

これは、テーブルに複数回参加することによっても実行できます。

select d1.name,
  d1.city [City 04/01/2013], 
  d2.city [City 05/01/2013]
from yourtable d1
left join yourtable d2
  on d1.name = d2.name
  and d2.date = '2013-05-01'
where d1.date = '2013-04-01'

SQL Fiddle with Demoを参照してください。

上記のクエリは、列に変換したい既知の日付がある場合にうまく機能します。ただし、列の数が不明な場合は、動的 sql を使用する必要があります。

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

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

select @colNames = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), date, 120)) +' as '+ QUOTENAME('City '+convert(char(10), date, 120))
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT name, ' + @colNames + ' from 
             (
                select name, 
                  city, 
                  convert(char(10), date, 120) date
                from yourtable
            ) x
            pivot 
            (
                max(city)
                for date in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

それらのすべてが結果を与えます:

|   NAME | CITY 04/01/2013 | CITY 05/01/2013 |
----------------------------------------------
|   Paul |           Milan |          Berlin |
| Charls |            Rome |        El Cairo |
|    Jim |           Tokyo |           Milan |
| Justin |   San Francisco |           Paris |
|   Bill |          London |          Madrid |
于 2013-02-06T15:44:26.057 に答える
1

最も簡単な方法は、CASE

SELECT  Name,
        MAX(CASE WHEN DATE = '04/01/2013' THEN City END) [City 04/01/2013],
        MAX(CASE WHEN DATE = '05/01/2013' THEN City END) [City 05/01/2013]
FROM    tableName
GROUP   BY Name
于 2013-02-06T15:44:54.000 に答える