2017-08-23 3 views
0

入力データは次のようになります。この例では、1行目を3行目に分割するテーブル2にテーブル1を変換するにはどうすればよいですか?どのように、私は1つのSQLの1行を複数の行に変換して合計する方法

表1

Task  |Month1 |Month1 plan in % |Month2 plan in % |Month3 plan in % 
-----------+-------+-----------------+-----------------+---------------- 
Data entry |Jun-17 |40    |40    |20 
Processing |Jul-17 |30    |70 
Delivery |Aug-17 |70    |30 

表2

Task  |Year |Month  |% work planned 
------------+-------+-----------+-------------- 
Data entry |2017 |June  |40 
Data entry |2017 |July  |40 
Data entry |2017 |August  |20 
Processing |2017 |July  |30 
Processing |2017 |August  |70 
Delivery |2017 |August  |70 
Delivery |2017 |September |30 

表3

Task  |Year |Month |Total % work completed 
------------+-------+-------+---------------------- 
Data entry |2017 |July |80 
Processing |2017 |July |30 
Delivery |2017 |July |0 
Data entry |2017 |August |100 
Processing |2017 |August |100 
Delivery |2017 |August |70 
+1

を生成するために、テーブル2上の合計を使用しますが、一つの質問やその他を選択してください。 –

+1

あなたはどんなDBMSを使用していますか?どのバージョン?関連するタグを質問に追加してください。 –

答えて

0

Iドンに3行の合計表3に表2を回すことができますあなたが使っているデータベースのタイプを知っていないので、私はPostgreSQLを使うことにしました。いくつかの詳細は異なりますが、アイデアは他のデータベースタイプでも機能するはずです。

表2は、共重合体で製造することができる。

例:

select "Task", "Month1", "Month1 plan in %" from data                               
union                                           
select "Task", "Month1", "Month2 plan in %" from data                               
union                                           
select "Task", "Month1", "Month3 plan in %" from data 

それが簡単に結合されたデータセット別名データで作業できるようにすること。このように:

select "Task", "Month1", "% work planned" from (
select "Task", "Month1", "Month1 plan in %" as "% work planned" from data 
union all 
select "Task", "Month1", "Month2 plan in %" as "% work planned" from data 
union all 
select "Task", "Month1", "Month3 plan in %" as "% work planned" from data 
) as combined where "% work planned" is not null; 

ヌル値を除外するwhere条件を追加したことに注目してください。これは、列3にヌル値が含まれているためです。

最後に、文字列を置換して文字列を置換して日付に変換し、その日付の月を出力する必要があります。次に例を示します。

select to_char(
    (
    (substring('Jul-17', '...') || 
    '-01' || 
    substring('Jul-17', '...$'))::date 
    ), 
    'MONTH') AS MONTH; 

は表3

+0

ありがとうuser1094125 - テーブル2は私のために働く - それは素晴らしいです。私はMS SQL Mgmtスタジオで作業し、日付の操作はto_char関数を使用して、ダブルコロン&パイプは私にとっては馴染みのないものです。あなたは素晴らしいだろうMSSQLで詳しく教えていただけますか? – texastonie

関連する問題