2017-05-03 6 views
-4

私は私の問題が重複する可能性の問題よりも少しユニークだと思う次の形式SQLピボット2列は

Table View

のテーブルを持っている、と私は201601の繰り返しを取得しようとしています... 2つのメトリックオーダーとコストの201652列。

+3

可能な重複http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot -in-sql-server) – Ben

+0

あなたはどのデータベースを使用していますか? – Taryn

+0

私はSQL Server 12を使用しています – user2827224

答えて

0

これは、独自のPIVOT()機能に依存しないすべてのデータベース(SQL Serverを含む)のアプローチです。しかし、このような例では52週間にわたりこれを行うのはちょっと変わってしまいます(実際には、105の結果の列は実際にレポートを読む人間の利益のために最良の出力ではありません)。 この例では、私は数週間ではなく1年の四半期でそれをやっていると言いましたが、表現を4回ではなく52回繰り返すだけです。 perlやVisual Basicなどを使用して、実際に文を生成することもできます。 は、ここに行く:

-- the input table, don't use in real query ... 
WITH 
input(id,quarter,orders,cost) AS (
      SELECT 1,201601,200,1000 
UNION ALL SELECT 1,201602,300,1500 
UNION ALL SELECT 1,201603,330,1800 
UNION ALL SELECT 1,201604,500,2500 
) 
-- end of input - 
SELECT 
    id 
, SUM(CASE quarter WHEN 201601 THEN orders END) AS "orders_201601" 
, SUM(CASE quarter WHEN 201602 THEN orders END) AS "orders_201602" 
, SUM(CASE quarter WHEN 201603 THEN orders END) AS "orders_201603" 
, SUM(CASE quarter WHEN 201604 THEN orders END) AS "orders_201604" 
, SUM(CASE quarter WHEN 201601 THEN cost END) AS "cost_201601" 
, SUM(CASE quarter WHEN 201602 THEN cost END) AS "cost_201602" 
, SUM(CASE quarter WHEN 201603 THEN cost END) AS "cost_201603" 
, SUM(CASE quarter WHEN 201604 THEN cost END) AS "cost_201604" 
FROM input 
GROUP BY id; 

id|orders_201601|orders_201602|orders_201603|orders_201604|cost_201601|cost_201602|cost_201603|cost_201604 
1|   200|   300|   330|   500|  1,000|  1,500|  1,800|  2,500 
([SQL Server内の 'ピボット' を使用して列に行を変換]の