162

私はこのようなテーブルを持っています...

CustomerID   DBColumnName   Data
--------------------------------------
1            FirstName      Joe
1            MiddleName     S
1            LastName       Smith
1            Date           12/12/2009
2            FirstName      Sam
2            MiddleName     S
2            LastName       Freddrick
2            Date           1/12/2009
3            FirstName      Jaime
3            MiddleName     S
3            LastName       Carol
3            Date           12/1/2009

そして、私はこれが欲しい...

これはPIVOTを使用して可能ですか?

CustomerID  FirstName   MiddleName          LastName        Date
----------------------------------------------------------------------
1           Joe             S               Smith           12/12/2009
2           Sam             S               Freddrick       1/12/2009
3           Jaime           S               Carol           12/1/2009
4

9 に答える 9

194

そうだね。でも何で !!??

   Select CustomerID,
     Min(Case DBColumnName When 'FirstName' Then Data End) FirstName,
     Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName,
     Min(Case DBColumnName When 'LastName' Then Data End) LastName,
     Min(Case DBColumnName When 'Date' Then Data End) Date
   From table
   Group By CustomerId
于 2009-08-27T19:03:56.713 に答える
121

MAXアグリゲートを使用できますが、それでも機能します。1つの値のMAX=その値。

この場合、customeridで5回自己結合し、テーブル参照ごとにdbColumnNameでフィルタリングすることもできます。それはうまくいくかもしれません。

于 2009-08-27T19:01:54.940 に答える
10

わかりました、悪い質問で申し訳ありません。gbn は私を正しい軌道に乗せました。これが私が答えで探していたものです。

SELECT [FirstName], [MiddleName], [LastName], [Date] 
FROM #temp 
PIVOT
(   MIN([Data]) 
    FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) 
)AS p

次に、while ステートメントを使用し、上記のステートメントを varchar として作成し、動的 ​​sql を使用する必要がありました。

このようなものを使用して

SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','')
SET @fullsql = @fullsql + 'FROM #temp '
SET @fullsql = @fullsql + 'PIVOT'
SET @fullsql = @fullsql + '('
SET @fullsql = @fullsql + ' MIN([Data])'
SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '+@fulltext
SET @fullsql = @fullsql + ')'
SET @fullsql = @fullsql + 'AS p'

EXEC (@fullsql)

while ループを使用して @fulltext を構築し、テーブルから個別の列名を選択する必要があります。答えてくれてありがとう。

于 2009-08-27T20:34:28.030 に答える
9

OPは実際には集計なしでピボットする必要はありませんでしたが、ここに来て方法を知るために:

SQLパラメータ化CTEクエリ

その質問への答えには、集約なしのピボットが必要な状況が含まれているため、それを行う例はソリューションの一部です。

于 2013-12-17T19:52:37.067 に答える
9
SELECT
main.CustomerID,
f.Data AS FirstName,
m.Data AS MiddleName,
l.Data AS LastName,
d.Data AS Date
FROM table main
INNER JOIN table f on f.CustomerID = main.CustomerID
INNER JOIN table m on m.CustomerID = main.CustomerID
INNER JOIN table l on l.CustomerID = main.CustomerID
INNER JOIN table d on d.CustomerID = main.CustomerID
WHERE f.DBColumnName = 'FirstName' 
AND m.DBColumnName = 'MiddleName' 
AND l.DBColumnName = 'LastName' 
AND d.DBColumnName = 'Date' 

編集: 私はこれをエディターなしで書きました & SQL を実行していません。お分かりいただけたと思います。

于 2009-08-27T19:17:25.237 に答える
1

これはうまくいくはずです:

select * from (select [CustomerID]  ,[Demographic] ,[Data]
from [dbo].[pivot]
) as Ter

pivot (max(Data) for  Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
于 2016-04-26T02:44:41.283 に答える
1

これを試して:

SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ...

FROM
(

SELECT CUSTOMER_ID, 
       CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME,
       CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME,
        ... and so on ...
GROUP BY CUSTOMER_ID

) TEMP

GROUP BY CUSTOMER_ID
于 2014-04-15T23:13:59.537 に答える
1

ピボット クエリの動的フィールドを構築する優れた方法を次に示します。

-- 値を tmp テーブルに要約します

declare @STR varchar(1000)
SELECT  @STr =  COALESCE(@STr +', ', '') 
+ QUOTENAME(DateRange) 
from (select distinct DateRange, ID from ##pivot)d order by ID

---生成されたフィールドを参照してください

print @STr

exec('  .... pivot code ...
pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P
order by Decile')
于 2016-12-01T18:11:13.793 に答える