2015-07-28 101 views
0

我有一個SQL SELECT語句,其中包含多個連接其他獨立SQL語句的多個UNION ALL關鍵字。如果沒有UNION ALL關鍵字,查詢太複雜了。WHERE跨越多個UNION ALL語句

但是,我想限制所有的子查詢到一個特定的日期範圍,我不想寫在他們每個的末尾完全相同的where子句。有沒有辦法可以爲他們寫一個WHERE條款?

我試過了下面的代碼,但它不起作用,因爲COUNT(*)這個短語可以防止爲每個記錄過濾inputDate列。另外從性能角度來看,如果有辦法做到這一點,最好先過濾日期列。

SELECT * FROM (
    SELECT count(*), inputDate 'sel1' as name FROM tblName WHERE name IN ('n1','n2') 
    UNION ALL 
    SELECT count(*), inputDate, 'sel2' as name FROM tblName WHERE name IN ('n3','n4') 
    UNION ALL 
    SELECT count(*), inputDate, 'sel3' as name FROM tblName WHERE name IN ('n5','n6') 
) names WHERE inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH) 
+0

請參考這一個http://stackoverflow.com/questions/1266666/using-union-and-count-together-in- sql-query –

+0

@AtaboyJosef這裏沒有討論我的關鍵問題 - 如何在多個'UNION ALL'語句中使用'WHERE'子句。解決問題的方式可能相似,但問題不是。 – user3413723

回答

2

你需要做的count(*)在外部查詢:

SELECT name, count(*), inputdate 
FROM (SELECT inputDate, 'sel1' as name FROM tblName WHERE name IN ('n1','n2') 
     UNION ALL 
     SELECT inputDate, 'sel2' as name FROM tblName WHERE name IN ('n3','n4') 
     UNION ALL 
     SELECT inputDate, 'sel3' as name FROM tblName WHERE name IN ('n5','n6') 
    ) names 
WHERE inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH) 
GROUP BY name; 

編輯:

其實,如果這些都來自同一個表,你不需要union all

select (case when name in ('n1', 'n2') then 'sel1' 
      when name in ('n3', 'n4') then 'sel2' 
      when name in ('n5', 'n6') then 'sel3' 
     end) as grp, count(*) 
from tblName 
where inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH) and 
     name in ('n1', 'n2', 'n3', 'n4',' n5', 'n6') 
group by grp; 
+0

我需要獨立計算每個子查詢。 – user3413723

+0

@ user3413723。 。 。這就是'group by'所做的。 –

+0

我試過兩個版本。兩者都可以工作,但第二個版本的速度大約快20倍! – user3413723