8

使用する集計関数がない場合、MS SQL の「ピボット」を使用して行を列に変換できるかどうかを知る必要があります。集計関数のみの例をたくさん見ました。私のフィールドは文字列データ型で、この行データを列データに変換する必要があります。これが、この質問を書いた理由です。誰か助けてくれませんか......よろしくお願いします。

4

3 に答える 3

15

PIVOTを使用してこの操作を実行できます。PIVOT を実行するときは、変換する行をコーディングする静的ピボットまたは実行時に列のリストを作成する動的ピボットを使用して、次の 2 つの方法のいずれかを実行できます。

静的ピボット ( SQL Fiddle with a Demo を参照):

SELECT *
FROM
(
  select empid, wagecode, amount
  from t1
) x
pivot
(
  sum(amount)
  for wagecode in ([basic], [TA], [DA])
) p

動的ピボット:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(wagecode) 
                  FROM t1 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid, ' + @cols + ' from 
             (
                 select empid, wagecode, amount
                 from t1
            ) x
            pivot 
            (
                sum(amount)
                for wagecode in (' + @cols + ')
            ) p '

execute(@query)

どちらも同じ結果になります

于 2012-06-11T11:58:00.677 に答える
1

サンプル形式

エンピッド ウェイコード 金額
1 ベーシック 1000
1 TA 500
1 DA 500
2 ベーシック 1500
2 TA 750
2 DA 750

エンピッドベーシック TA DA
1 1000 500 500
2 1500 750 750

私が得た答えは

   SELECT empID , [1bas] as basic, [1tasal] as TA,[1otsal] as DA
   FROM (
   SELECT empID, wage, amount
   FROM table) up
   PIVOT (SUM(amt) FOR wgcod IN ([1bas], [1tasal],[1otsal])) AS pvt
   ORDER BY empID 
   GO
于 2012-06-11T11:37:32.447 に答える
0

これを試して:

SELECT empid AS EmpID     
, ISNULL(SUM(CASE wagecode WHEN 'basic' THEN Amount ELSE 0 END), 0) AS Basic         
, ISNULL(SUM(CASE wagecode WHEN 'ta' THEN Amount ELSE 0 END), 0) AS TA     
, ISNULL(SUM(CASE wagecode WHEN 'da' THEN Amount ELSE 0 END), 0) AS DA 
FROM Employee
GROUP BY empid 
于 2012-06-11T11:52:50.043 に答える