2013-02-03 37 views
0

我已经将SQL用于简单查询,但现在需要执行一些更复杂的操作。我不知道如何嵌套查询。按行计算总计2个字段并按月查询最大值

我有一个表具有以下的列:

Date, Daily Power, Daily Power 1, Daily power2 

我需要找到一个max daily values,然后通过过滤月。另外我需要Daily Power 1Daily Power 2总结成一个新的专栏。

任何帮助,将不胜感激。

+1

什么RDBMS您使用的?我还缺少示例数据,期望的结果以及您尝试过的内容。 –

+0

编辑您的问题给我们更多的信息 – veljasije

回答

1

表格问题的部分原因是数据未归一化,因为您有3列,每列包含DailyPower的单独值。

您可以轻松获得所需结果的一种方法是使用UNION ALL查询的unpivot数据。

该查询将从多个列取数据,并把它变成多行使用说明:

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 Fiddle with Demo。此查询需要的数据,并将其转换成结果:

|  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 Fiddle with Demo。这给出结果:

|  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 Fiddle with Demo

+0

谢谢,硫听起来像它应该工作,我会给它一个! –

+0

嗨工作好,那么我怎么也按月收呢?选择日期, MAX(值)kWhOpenHrs, 总和(情况下,当栏在( 'zkWhClsedAndOccupied', 'zkWhClsedAndNotOccupied')然后值一端) ( 选择日期kWhClsedTotal 'zkWhOpenHrs' 作为栏,kWhOpenHours作为值 从dbo.tblDailyPowerConsumption union all select date,'zkWhClsedAndNotOccupied'as col,kWhClosedAndNotOccupied as value from dbo。tblDailyPowerConsumption UNION ALL 选择日期,从dbo.tblDailyPowerConsumption 'zkWhClsedAndOccupied' 的关口,作为kWhClosedAndOccupied值 )SRC GROUP BY日期 –

+0

@EugeneBennett见我的编辑和你将如何改变您的查询。你还使用什么数据库?该查询可以被改变以与特定的数据库产品一起工作。 – Taryn

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 

这假设每个日期您的数据都有一行。

+0

谢谢,我会试一试 –