1

Web アプリケーション バックエンドを Access から MSSQL に移行していますが、MSSQL で次のクエリを再現できませんでした。何かアイデアはありますか?

TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;

Followupこのクエリは、EAV テーブルから通常のテーブルにデータを変換することに注意してください。これはテーブルのデザインですFollowup:

ここに画像の説明を入力

4

1 に答える 1

6

SQL Server ではPIVOT関数を使用でき、クエリは次のように設定されます。

select MRN, Value1, Value2
from
(
  select MRN, FUData, FU
  from FollowUp
) src
pivot
(
  max(FUData)
  for FU in (Value1, Value2)
) piv

Value1、 などを、Value2列にする必要があるアイテムの値のいずれかに置き換えます。

SQL Server 2008 にはFIRST()関数がないため、別の集計関数を使用するか、 の各項目の最初のレコードを返すような方法でデータをクエリする必要がありますFU

CASEこれを記述する別の方法は、ステートメントで集計関数を使用することです。

select MRN, 
  max(case when FU = 'value1' then FUData else null end) Value1,
  max(case when FU = 'value2' then FUData else null end) Value2
from FollowUp
group by MRN

上記のバージョンは、FU列に変換する既知の値がある場合はうまく機能しますが、そうでない場合は、次のような動的 SQL を使用する必要があります。

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

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

set @query = 'SELECT MRN,' + @cols + ' from 
             (
                select MRN, FUData, FU
                from FollowUp
            ) x
            pivot 
            (
                max(FUData)
                for FU in (' + @cols + ')
            ) p '

execute(@query)
于 2013-01-08T18:29:59.177 に答える