2011-06-07 32 views
1

兩個查詢返回行的不同沒有。兩個查詢日期範圍內的值返回行的不同沒有

Query1: 
---------- 
SELECT t1.a1, t1.a2, t2.b1,t2.b2 
from (SELECT a1,a2 from xyz WHERE (date BETWEEN '2011-01-01' AND '2011-01-30') 
AND id = 70 GROUP BY a1 a2)t1, 
(SELECT a1,a2 from xyz WHERE (date BETWEEN '2011-01-01' AND '2011-01-30') 
AND id = 70 GROUP BY a1 a2)t2, t3 

where t1.a1=t3.a1 
and t2.a1=t3.a1 


output 1: 
--------------- 
a1 a2 b1 b2 
--------------- 
1 2 7 4 
1 3 4 2 
1 6 5 1 

上面的查詢有什麼問題嗎?

我有相同的結構化查詢,它給我帶來了一些列。

當我使用UNION ALL它給我帶來更多的行比以前的查詢

query2: 
--------------- 
SELECT t1.a1, t1.a2, '' as b1,'' as b2 
FROM(SELECT a1,a2 from xyz WHERE (date BETWEEN '2011-01-01' AND '2011-01-31') 
AND id = 70 GROUP BY a1 a2)t1, t3 
where t1.a1=t3.c1 

UNION ALL 

SELECT '' AS a1, '' AS a2, t2.b1,t2.b2 
FROM(SELECT a1,a2 from xyz WHERE (date BETWEEN '2011-02-01' AND '2011-02-30') 
AND id = 70 GROUP BY a1 a2)t1, t3 
where t2.b1=t3.c1 

output 2: 
--------------- 
a1 a2 b1 b2 
--------------- 
1 2  4 
1 3  2 
1 6 5 
4 8 3 

如果我有想到的任何其他技術則請告知做同樣的查詢。

注:我需要在這樣的銷售數量爲MONTH1和MONTH2一個銷售人的報告拖不同日期範圍內的數據比較個月的銷量。 「Ouptup1」將解決我的問題。請建議。 注意:我並不是非常喜歡查詢數據。

謝謝。 Shahidul-孟加拉國達卡。

回答

1

第一個查詢可以(也應該)wrrite像這樣(修正什麼我假設應該是兩個不同的日期範圍):

Select t1.a1 
    , t1.a2 
    , t2.b1 
    ,t2.b2 
From (
     Select a1,a2 
     From xyz 
     Where date Between '2011-01-01' And '2011-01-30' 
      And id = 70 
     Group By a1,a2 
     ) As t1 
    Join t3 
     On t3.a1 = t1.a1 
    Join ( 
      Select a1,a2 
      From xyz 
      Where date Between '2011-02-01' And '2011-02-28' 
       And id = 70 
      Group By a1, a2 
      ) As t2 
     On t2.a1 = t3.a1 

你應該避免編寫查詢,其中在你單獨的表從子句使用逗號。這種語法已被棄用,並且IMO更難以遵循查詢。更好的語法是我已經演示的ANSI/ISO加入語法。

對於連續出現在你的第一個查詢,就必須在表t3存在的a1值,必須存在一個排爲a1值與一月的日期範圍內和一定存在一排二月我會假設你要出現在任何一月二月或數據

鑑於我覺得是你的要求,下面可能會爲你提供你想要的東西:

Select T1.a1, T1.a2 
    , T2.a1 As b1, T2.a2 As b2 
From (
     Select a1, a2 
     From xyz 
      Join t3 
       On t3.a1 = xyz.a1 
     Where xyz.id = 70 
      And xyz.date >= '2011-01-01' And xyz.date < '2011-02-01' 
     Group By a1, a2 
     ) As T1 
    Full Join (
       Select a1, a2 
       From xyz 
        Join t3 
         On t3.a1 = xyz.a1 
       Where xyz.id = 70 
        And xyz.date >= '2011-02-01' And xyz.date < '2011-03-01' 
       Group By a1, a2 
       ) As T2 
     On T2.a1 = T1.a1 

雖然上述闕ry與您所問的內容很接近,將每個月的數據堆疊起來會比較簡單,而不是試圖並排顯示。要做到這一點,你可以使用UNION ALL類似於你嘗試的方式:

Select 'Jan' As Month, a1, a2 
From xyz 
    Join t3 
     On t3.a1 = xyz.a1 
Where xyz.id = 70 
    And xyz.date >= '2011-01-01' And xyz.date < '2011-02-01' 
Group By a1, a2 
Union All 
Select 'Feb', a1, a2 
From xyz 
    Join t3 
     On t3.a1 = xyz.a1 
Where xyz.id = 70 
    And xyz.date >= '2011-02-01' And xyz.date < '2011-03-01' 
Group By a1, a2 
+0

托馬斯感謝您的幫助 – Shahidul 2011-06-07 10:53:28

+0

托馬斯感謝您的幫助,我曾試圖用自己的方式,並試圖獲得滿意的結果。我是半成功的。兩個查詢返回少一些列(如第一個查詢返回90行,但第二個查詢返回的88行,當我全加入他們一起返回只有88行),現在我想是所有行同時從查詢返回。謝謝。 – Shahidul 2011-06-07 11:04:49

+0

@ Shahidul-根本問題是加入'xyz.a1'。將二月份數據堆疊而非並排的Jan數據會更容易。我會更新我的帖子來說明。 – Thomas 2011-06-07 15:24:04

相關問題