2011-06-18 9 views
1

テーブルから2つの異なる結果を選択するクエリを作成しようとしています。同じテーブルの複数のレコードを選択

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 

元のクエリの何が問題だった:あなたはSUM()を使用する必要があるときにCOUNT()を使用し、

まず。

次に、テーブルsaleの2つのインスタンスを結合します。 t.items >0 AND s.items < 0を使用した場合、これはうまくいくかもしれませんが、より複雑になり、t.supp = s.suppも必要になります。 Unneccecarily複雑さ(それはそれでも動作しないかもしれません)。

第3に、where t.items='1' and s.items='-1'条件では、1または-1以外の項目の行は合計されません。そして、あなたは戸惑いながら、3のようにいくつか違っています。

+0

ありがとうございました!私の質問に間違っていましたか? –

+1

これは正の代わりにリターンの負の合計が残っています。売り切れで注文していません(私はそれがマイナーなことを知っています):) –

+0

@fiver:thnx、fixed –

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つの列を完全に省略します。次に、2つの列でグループ化して、ペアを数えるようにします。基本的に多くのことがクエリで間違っています:) –

関連する問題