2011-06-18 87 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的列。然後你分成兩列,所以它就像你計數對...基本上很多事情是錯誤的,你的查詢:) –