2016-03-22 57 views
6

ここにいくつかのunpivot/crossディスカッションディスカッションがありますが、私の問題をカバーするディスカッションは見つかりませんでした。私がこれまで持っていることは以下の通りです:TSQL名前付き行を使用した複数の列のアンピボットは可能ですか?

SELECT Perc, Salary 
FROM (
    SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median 
    FROM vCalculatedView 
    WHERE JobID = '1' 
    GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median] 
) a 
UNPIVOT (
    Salary FOR Perc IN (Perc10, Perc25, Median) 
) AS calc1 

、私が希望することなど、いくつかの他の列を追加することです。私はPerc10、Perc25、Median Rowsに入れたいBonusという名前のものもあります。

また、私はクロス・アプライで問合せを作成しましたが、ここではアンピボットのように行をソートすることはできません。言い換えれば、私はカスタムソートを持つことはできませんが、正しければテーブル内の数字に従ったソートだけです。少なくとも、ここには私が望むような結果が得られますが、行は間違った順序であり、Perc10などの行の名前はありません。

SELECT crossapplied.Salary, 
     crossapplied.Bonus 
FROM vCalculatedView v 
CROSS APPLY (
    VALUES 
      (Salary_10, Bonus_10) 
     , (Salary_25, Bonus_25) 
     , (Salary_Median, Bonus_Median) 
) crossapplied (Salary, Bonus) 
WHERE JobID = '1' 
GROUP BY crossapplied.Salary, 
     crossapplied.Bonus 

ここで、PercentはPercentileの略です。

出力は次のようなものであることを意図している:

+--------------+---------+-------+ 
| Calculation | Salary | Bonus | 
+--------------+---------+-------+ 
| Perc10  |  25 |  5 | 
| Perc25  |  35 | 10 | 
| Median  |  27 |  8 | 
+--------------+---------+-------+ 

私は何かを欠場か間違っている私に何かをしたのですか?私はMSSQL 2014を使用していますが、出力はSSRSに入ります。事前にヒントをいただきありがとうございます!明確化のため

編集:アンピボット-方法は、以下の出力が得られます。

+--------------+---------+ 
    | Calculation | Salary | 
    +--------------+---------+ 
    | Perc10  |  25 | 
    | Perc25  |  35 | 
    | Median  |  27 | 
    +--------------+---------+ 

ので、ここで列「ボーナス」を欠いています。

クロス適用-方法は、次のような出力が得られます。

+---------+-------+ 
| Salary | Bonus | 
+---------+-------+ 
|  35 | 10 | 
|  25 |  5 | 
|  27 |  8 | 
+---------+-------+ 

あなたが意図した出力と比較した場合ので、あなたはコラム「計算」は不足していると、行のソートが間違っていることがわかります(行25 | 5は最初の行ではなく2行目にあることに注意してください)。

編集2:ビューの定義とサンプルデータ: ビューは基本的にテーブルの計算カラムを追加するだけです。この表では、各JobIDにSalaryとBonusのようなColumnsがあります。ビューは、その後、ちょうどこのようなパーセンタイルを計算します。

Select 
    Percentile_Cont(0.1) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_10, 

    Percentile_Cont(0.25) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_25 
from Tabelle 

ので、出力は以下のようである:最後に

+----+-------+---------+-----------+-----------+ 
| ID | JobID | Salary | Salary_10 | Salary_25 | 
+----+-------+---------+-----------+-----------+ 
| 1 |  1 |  100 |  60 |  70 | 
| 2 |  1 |  100 |  60 |  70 | 
| 3 |  2 |  150 |  88 |  130 | 
| 4 |  3 |  70 |  40 |  55 | 
+----+-------+---------+-----------+-----------+ 

、ビュー、ストアドプロシージャにパラメータ化されます。

+1

あなた 'vCalculatedView'は事前に計算を行うようです...何もしていませんby'あなたの'グループ...あなたの声明で得られた結果を示し、サンプルデータと予想される結果を提供してください。 – Shnugo

+0

クロス・アプライ・コード内のグループは何かをします:もし私がそれをPerc10、Perc25に入れないなら、メディアンは何度も何度も繰り返します。これは、ジョブIDが従業員IDではないため、ジョブIDに複数の従業員が含まれる可能性があるためです。 – ksauter

+0

OK。私はあなたが何を意味するかを見ます。 「SELECT DISTINCT」を持つ 'CTE'は、むしろ必要なものです。 'GROUP BY'は' MAX() 'や' SUM() 'のような集計に使用します。現在のクエリの結果とデータの表示方法を指定してください。 – Shnugo

答えて

1

これはあなたのアプローチですか?

あなたの編集後、CROSS APPLYのあなたの解決策は正しいデータで返されますが、正しい出力では返ってこないことを理解しています。あなたのVALUESに一定の値を追加し、ラッパーSELECTで並べ替えを行うことができます。

SELECT wrapped.Calculation, 
     wrapped.Salary, 
     wrapped.Bonus 
FROM 
(
    SELECT crossapplied.* 
    FROM vCalculatedView v 
    CROSS APPLY (
     VALUES 
       (1,'Perc10',Salary_10, Bonus_10) 
      , (2,'Perc25',Salary_25, Bonus_25) 
      , (3,'Median',Salary_Median, Bonus_Median) 
    ) crossapplied (SortOrder,Calculation,Salary, Bonus) 
    WHERE JobID = '1' 
    GROUP BY crossapplied.SortOrder, 
      crossapplied.Calculation, 
      crossapplied.Salary, 
      crossapplied.Bonus 
) AS wrapped 
ORDER BY wrapped.SortOrder 
+0

ありがとうございました!あなたの解決策を正しいものとしてマークしました。しかし、他の読者にとっては、SalaryとBonusだけでなく、すべての列(SortOrder、Calculation、Salary、Bonus)をGROUP BY句に入れる必要があります。昨夜、CTEとLEFT JOINのUNPIVOTメソッドを使ってクエリを書きましたが、それはもちろんもっと長いコードです。読者が来るために、私はこれを別の答えとして書きますが、それはあなたの解決策を打ち負かすものではありません。あなたのソリューションは、多くの場合、CROSS APPLYが数多くのブロガーと比較してピボット解除されているのと同じように、もう一度表示されます。受諾のために – ksauter

+1

Thx! 'GROUP BY COLUMNS'についてのヒントを反映するために私の答えを編集しました。あなたが私の答えが好きなら、それを追加投票するのは親切でしょう。投票と受け入れは2つの別々のステップです... Thx again! – Shnugo

関連する問題