テーブルの問題の一部は、それぞれがの個別の値を含む3つの列があるため、データが正規化されないことですDailyPower
。
必要な結果を簡単に取得できる1つの方法は、クエリを使用してデータのピボットを解除することです。UNION ALL
このクエリは、複数の列からデータを取得し、使用するために複数の行に変換します。
select date, 'DailyPower' as col, DailyPower as value
from yourtable
union all
select date, 'DailyPower1' as col, DailyPower1 as value
from yourtable
union all
select date, 'DailyPower2' as col, DailyPower2 as value
from yourtable
SQL FiddlewithDemoを参照してください。このクエリはデータを取得し、それを結果に変換します。
| DATE | COL | VALUE |
------------------------------------
| 2012-01-01 | DailyPower | 456 |
| 2012-01-02 | DailyPower | 789 |
| 2012-02-01 | DailyPower | 23 |
| 2012-01-01 | DailyPower1 | 789 |
| 2012-01-02 | DailyPower1 | 235 |
| 2012-02-01 | DailyPower1 | 89 |
| 2012-01-01 | DailyPower2 | 65 |
| 2012-01-02 | DailyPower2 | 45 |
| 2012-02-01 | DailyPower2 | 10 |
max()
データが行に入ると、日付で値を取得するのが簡単になります。
クエリは次のようになります。
select date,
max(value) MaxDailyPower,
sum(case when col in ('DailyPower1', 'DailyPower2') then value end) TotalDailyPower
from
(
select date, 'DailyPower' as col, DailyPower as value
from yourtable
union all
select date, 'DailyPower1' as col, DailyPower1 as value
from yourtable
union all
select date, 'DailyPower2' as col, DailyPower2 as value
from yourtable
) src
where date >= '2012-01-01'
and date <= '2012-12-31'
group by date
SQL FiddlewithDemoを参照してください。これにより、次の結果が得られます。
| DATE | MAXDAILYPOWER | TOTALDAILYPOWER |
------------------------------------------------
| 2012-01-01 | 789 | 854 |
| 2012-01-02 | 789 | 280 |
| 2012-02-01 | 89 | 99 |
#1を編集します。月になりたい場合はGROUP BY
、次を使用できます。
select month(date) Month,
max(value) MaxDailyPower,
sum(case when col in ('DailyPower1', 'DailyPower2') then value end) TotalDailyPower
from
(
select date, 'DailyPower' as col, DailyPower as value
from yourtable
union all
select date, 'DailyPower1' as col, DailyPower1 as value
from yourtable
union all
select date, 'DailyPower2' as col, DailyPower2 as value
from yourtable
) src
group by month(date)
SQL FiddlewithDemoを参照してください