2011-06-18 52 views
1

我想写一个查询,将从表中选择两个不同的结果。从同一表中选择多条记录

我们假设以下是表销售:

Supp       items 
A         1 
A         1 
A         3 
A        -1 //negative represent return item 
B         1 

我要选择销售产品和退回的产品总和。所以下面将是结果:

Supp Sale Return 
A  5  1 
B  1  0 

我想下面的查询,但没有得到预期的效果

select 
t.Supp, count(t.items)'Quantity', count(s.items)'ReturnedQuantity' 
from sale t, sale s 
where t.items='1' and s.items='-1' 
group by 
    t.supp,s.supp 
order by 
    sum(cast(t.items as int)) desc 

会有人告诉我这将是查询得到这样的结果?

回答

3
SELECT 
     Supp 
    , SUM(CASE WHEN items > 0 
       THEN items 
       ELSE 0 
      END 
     ) 
     AS SoldQuantity 
    , - SUM(CASE WHEN items < 0 
        THEN items 
        ELSE 0 
      END 
      ) 
     AS ReturnedQuantity 
FROM sale 
GROUP BY Supp 
ORDER BY SoldQuantity DESC   --- or ORDER BY Supp 
            --- whatever is needed 

什么是错的原始查询:

首先,你用COUNT()时,你应该使用SUM()

第二次加入表sale的两个实例。如果您使用过t.items >0 AND s.items < 0,这可能会奏效但它会更复杂,您还需要t.supp = s.supp。不合理的复杂性(甚至可能甚至无法工作)。

第三,where t.items='1' and s.items='-1'条件不计算任何不同于1-1的项。而且你有着不同的看法,比如3

+0

谢谢!您能否告诉我。我的查询出了什么问题? –

+1

这一个仍然负回报,而不是积极的,也不是销售desc(我知道它是次要的):) –

+0

@fiver:thnx,固定 –

3
SELECT t.Supp AS 'Supp', SUM(t.items) AS 'Sale', SUM(t.return_items) AS 'Return' FROM   (
    SELECT Supp AS Supp, 
    CASE WHEN items < 0 THEN 0 ELSE items END AS items, 
    CASE WHEN items > 0 THEN 0 ELSE -items END AS return_items 
    FROM tb_Test 
) AS t 
GROUP BY t.Supp 
ORDER BY 'Sale' desc 
+0

@ Zain,你做一个交叉连接和过滤这些列左边有1,右边是-1,但是这种方式完全忽略了那些有3的列。然后你分成两列,所以它就像你计数对...基本上很多事情是错误的,你的查询:) –