単純なクエリにSQLを使用しましたが、もう少し複雑な処理を実行する必要があります。クエリをネストする方法がわかりません。
次の列を持つテーブルが1つあります。
Date, Daily Power, Daily Power 1, Daily power2
それを見つけてmax daily values、月でフィルタリングする必要があります。また、私は必要Daily Power 1でありDaily Power 2、新しい列に合計されます。
どんな助けでもいただければ幸いです。
単純なクエリにSQLを使用しましたが、もう少し複雑な処理を実行する必要があります。クエリをネストする方法がわかりません。
次の列を持つテーブルが1つあります。
Date, Daily Power, Daily Power 1, Daily power2
それを見つけてmax daily values、月でフィルタリングする必要があります。また、私は必要Daily Power 1でありDaily Power 2、新しい列に合計されます。
どんな助けでもいただければ幸いです。
テーブルの問題の一部は、それぞれがの個別の値を含む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を参照してください
これは、あなたの望むことですか?
select date,
(case when DailyPower > DailyPower1 and DailyPower > DailyPower2 then DailyPower
when DailyPower1 > DailyPower2 then DailyPower1
else DailyPower2
) as MaxDailyPower,
coalesce(DailyPower1, 0) + Colaesce(DailyPower2) as DailyPowerSUm
from t
where date between '2012-01-01' and '2012-03-31' -- for the filter
これは、データの日付ごとに1つの行があることを前提としています。