2011-06-07 31 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

相关问题