2017-11-29 14 views
1

私は単純な在庫表を持っています。それぞれのレコードは "Item_code"のセットの1つを持っています。各Item_codeグループで販売されているアイテムの割合を計算したいと思います。2つのMySQL SELECTステートメントからの比率を計算します

PHPで3ステップで実行するのは簡単ですが、1つのステートメントで行う方法を理解できません。出来ますか?

(合計(価格)の部分を追加するために編集。)

1)

Select Item_code, count(*), sum(Price) as value1 
       From Inventory 
       group 
        by Item_Code 

2)

Select Item_Code, count(*) , sum(Price) as value2 
     from Inventory 
     WHERE Status like "Sold" 
     group 
      by Item_code 

販売3)パーセント=(2)/(1) 、それぞれのItem_code

販売額のパーセント=値2 /値1

結果は、次の形式になります

+0

ここで親指の簡単なルールがあります。明確な節は(ほぼ)GROUP BY節と同じクエリには現れません。 – Strawberry

+0

あなたはそうです。 DISTINCTを削除しました。 – canadaroy

答えて

1

countを販売販売

商品コード/上場番号/販売数/割合/値リストされている/値/パーセント値はnull秒を無視します。したがって、あなたはwhere句を使用することなく、そこからパーセンテージは簡単です取得に販売された商品の数をカウントするcase表現を使用することができます。

SELECT item_code, 
     COUNT(*) AS listed, 
     COUNT(CASE status WHEN 'Sold' THEN 1 END) AS sold, 
     COUNT(CASE status WHEN 'Sold' THEN 1 END) * 100.0/COUNT(*) AS percentage 
FROM  inventory 
GROUP BY item_code 
+0

私が尋ねたことを完璧に機能します。しかし、私はsum(value)について尋ねることを忘れてしまい、あなたのアプローチをsum()を許すように拡張することはできません。これはCASEがTrue/Falseを返すので機能します。したがって、COUNT(CASE())は 'trues'をカウントアップします。 – canadaroy

+0

@canadaroy 'count'はヌルをスキップします。 'case'はあなたが望むものを返します。この場合、' status = 'sold''の行に対しては '1'を返し、それ以外の場合は暗黙的に' null'を返します。 'sum'に対しても同じことを行うことができます。これは' null'も無視します。 'sum( '売り'が終わったときの大文字と小文字の区別)'。 – Mureinik

関連する問題