0

単純なクエリにSQLを使用しましたが、もう少し複雑な処理を実行する必要があります。クエリをネストする方法がわかりません。

次の列を持つテーブルが1つあります。

Date, Daily Power, Daily Power 1, Daily power2

それを見つけてmax daily values、月でフィルタリングする必要があります。また、私は必要Daily Power 1でありDaily Power 2、新しい列に合計されます。

どんな助けでもいただければ幸いです。

4

2 に答える 2

1

テーブルの問題の一部は、それぞれがの個別の値を含む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を参照してください

于 2013-02-04T11:36:51.037 に答える
0

これは、あなたの望むことですか?

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つの行があることを前提としています。

于 2013-02-03T22:44:47.383 に答える