0

SQLクエリについてサポートが必要です。

私は2つのテーブルUSERSとを持っていENDPOINTます。ユーザーごとに、ENDPOINTテーブルに3つの行が定義されています。

USER   ENDPOINT      ENDPOINTTYPE
123    123456        HomePhone
123    456789        CellPhone
123    A@gmail.com   Email

このデータを1行で表示したい例:

USER   HomePhone   CellPhone   Email

これを実現する方法を教えてください。

どうもありがとう!

4

2 に答える 2

4

このタイプのデータ変換は、ピボットと呼ばれます。SQL Server には、SQL Server 2005 からピボット機能があります。

CASESQL Server 2005 より前のバージョンでは、次の式を含む集計関数を使用してこれを行うことができました。

select [user],
  max(case when ENDPOINTTYPE = 'HomePhone' then EndPoint end) HomePhone,
  max(case when ENDPOINTTYPE = 'CellPhone' then EndPoint end) CellPhone,
  max(case when ENDPOINTTYPE = 'Email' then EndPoint end) Email
from yourtable
group by [user];

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

SQL Server 2005 以降を使用している場合、ピボット クエリは次のようになります。

select *
from
(
  select [user], endpoint, endpointtype
  from yourtable
) src
pivot
(
  max(endpoint)
  for endpointtype in (HomePhone, CellPhone, Email)
) piv

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

上記のクエリは、事前に値がわかっている場合にうまく機能します。そうでない場合は、動的 sql を使用する必要があります。

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

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

set @query = 'SELECT [USER],' + @cols + ' from 
             (
                select [USER], [ENDPOINT], [ENDPOINTTYPE]
                from yourtable
            ) x
            pivot 
            (
                max(ENDPOINT)
                for ENDPOINTTYPE in (' + @cols + ')
            ) p '

execute(@query)

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

すべてのクエリは同じ結果を返します。

| USER | HOMEPHONE | CELLPHONE |       EMAIL |
----------------------------------------------
|  123 |    123456 |    456789 | A@gmail.com |
于 2013-01-11T19:42:19.010 に答える
2

次のようなことを試してください:

SELECT 
    U.[User], 
    EP1.EndPoint as 'HomeEndpoint', EP1.Endpotintype as 'HomeEndpointType', 
    EP2.EndPoint as 'CellEndpoint', EP2.Endpotintype as 'CellEndpointType', 
    EP3.EndPoint as 'EmailEndpoint', EP3.Endpotintype as 'EmailEndpointType'
FROM Users U
    LEFT JOIN EndPoint EP1 ON U.[User] = EP1.[User] AND EP1.EndPointType = 'HomePhone'
    LEFT JOIN EndPoint EP2 ON U.[User] = EP2.[User] AND EP2.EndPointType = 'CellPhone'
    LEFT JOIN EndPoint EP3 ON U.[User] = EP3.[User] AND EP3.EndPointType = 'Email'

または、これらの 4 列だけを返すには:

SELECT 
    U.[User], 
    EP1.EndPoint as 'Home Phone', 
    EP2.EndPoint as 'Cell Phone', 
    EP3.EndPoint as 'Email'
FROM Users U
    LEFT JOIN EndPoint EP1 ON U.[User] = EP1.[User] AND EP1.EndPointType = 'HomePhone'
    LEFT JOIN EndPoint EP2 ON U.[User] = EP2.[User] AND EP2.EndPointType = 'CellPhone'
    LEFT JOIN EndPoint EP3 ON U.[User] = EP3.[User] AND EP3.EndPointType = 'Email'

ここにSQL Fiddleがあります-- 注: 列 User を UserId に変更しました。これは予約語であるためです (または括弧を使用することもできます)。

于 2013-01-11T19:27:07.590 に答える