2014-12-01 95 views
1

我有以下疑問:如何在同一結果表中包含來自兩個查詢的信息?

select year, avg(value) as winter_avg_Miami from AP_DATA where substring(series_id, 8) ='killowatts' and substring(series_id, 3,5) = 'Miami' and period IN ('M10','M11','M12') group by year; 
select year, avg(value) as winter_avg_notMiami from AP_DATA where substring(series_id, 8) = 'killowatts' and substring(series_id, 3,5) != 'Miami' and period IN ('M10','M11','M12') group by year; 

我想要做的是不是得到兩個不同的表,一個像:

year  winter_avg_Miami 
2000    28.1 
2001    30.2 

和另一個表所示:

year  winter_avg_notMiami 
2000    40.1 
2001    50.2 

我想只是在一張表中包含所有信息,例如:

year  winter_avg_Miami winter_avg_notMiami 
2000    28.1    40.1 
2001    30.2    50.2 

如何編寫我的查詢以完成此操作?

+0

這是一個數據透視查詢,並且mysql不支持它們。你最好只用一個查詢,然後按grouptring(seris_id,3,5)='Miami',year'分組,然後將記錄轉換爲客戶端代碼中的列。 – 2014-12-01 20:24:14

回答

1

您可以在avg骨料使用case聲明:

select year, 
    avg(case when substring(series_id, 3,5) = 'Miami' then value end) as winter_avg_Miami, 
    avg(case when substring(series_id, 3,5) != 'Miami' then value end) as winter_avg_notMiami 
from AP_DATA 
where substring(series_id, 8) ='killowatts' 
    and period IN ('M10','M11','M12') 
group by year 
+0

完美工作,最好非常可讀/易於理解。正是我期待的!謝謝:) – coderasd 2014-12-01 20:59:59

0
select 
     year, 
     case when CntMiami = 0 then 0 else TotMiami/CntMiami end) as AvgMiami, 
     case when CntNotMiami = 0 then 0 else TotNotMiami/CntNotMiamt end) as AvgNotMiami 
from 
    (
select 
     year, 
     sum(case when substring(series_id, 3,5) = 'Miami' then value else 0 end) as TotMiami, 
     sum(case when substring(series_id, 3,5) = 'Miami' then 1 else 0 end) as CntMiami, 
     sum(case when substring(series_id, 3,5) != 'Miami' then value else 0 end) as TotNotMiami, 
     sum(case when substring(series_id, 3,5) != 'Miami' then 1 else 0 end) as CntNotMiami 
    from 
     AP_DATA 
    where 
      substring(series_id, 8) ='killowatts' 
     and period IN ('M10','M11','M12') 
    group by 
     year) 
0

如果你的查詢都是正確的,這應該工作:

SELECT a.year, a.winter_avg_Miami, b.winter_avg_notMiami 
From (select year, avg(value) as winter_avg_Miami 
    from AP_DATA where substring(series_id, 8) ='killowatts' and 
     substring(series_id, 3,5) = 'Miami' and period IN ('M10','M11','M12') 
    group by year)a, 
    (select year, avg(value) as winter_avg_notMiami 
    from AP_DATA where substring(series_id, 8) = 'killowatts' and 
    substring(series_id, 3,5) != 'Miami' and period IN ('M10','M11','M12') 
    group by year) b 
WHERE a.year = b.year; 
+0

工作很好,我試圖這麼多的變化我的查詢試圖實現這一點,但我無法弄清楚它!你幫助我理解這些類型的查詢的正確格式以及使用別名。非常感謝! – coderasd 2014-12-01 21:00:53

0

UNIONS是一個簡單的選擇,如果有一些原因,你不能做像sgeddes建議更傳統的方式之一。

0

請嘗試以下解決方案:

解決方案:1

select ap1.year, avg(ap1.value) as winter_avg_Miami,avg(ap2.value) as winter_avg_notMiami 
 
from AP_DATA ap1 left join ap2.AP_DATA on ap1.year=ap2.year 
 
where substring(ap1.series_id, 8) ='killowatts' and substring(ap1.series_id, 3,5) = 'Miami' and ap1.period IN ('M10','M11','M12') 
 
substring(ap2.series_id, 8) = 'killowatts' and substring(ap2.series_id, 3,5) != 'Miami'and ap2.period IN ('M10','M11','M12') 
 
group by ap1.year;

解決方案:2

--create temp table 
 
create table temp1 
 
(year int, winter_avg_Miami int null,winter_avg_notMiami int null) 
 

 
--insert into temp table 
 
insert into temp1 
 
(year int, winter_avg_Miami ,winter_avg_notMiami) 
 
(
 
select year, avg(value) as winter_avg_Miami,null as winter_avg_notMiami from AP_DATA where substring(series_id, 8) ='killowatts' and substring(series_id, 3,5) = 'Miami' and period IN ('M10','M11','M12') group by year 
 
union all 
 
select year, null as winter_avg_Miami, avg(value) as winter_avg_notMiami from AP_DATA where substring(series_id, 8) = 'killowatts' and substring(series_id, 3,5) != 'Miami' and period IN ('M10','M11','M12') group by year 
 
) 
 

 
--result in single table 
 
select year,avg(winter_avg_Miami) as winter_avg_Miami,avg(winter_avg_notMiami) as winter_avg_notMiami 
 
from temp1 
 
group by year

我在sybase上面試過了以上的解決方案。它工作得很好。

希望這有助於:)

相關問題