2017-12-15 9 views
1

を計算し、私はここで2つのテーブルがいくつかのSQLの難しさがある - 販売し、製品:私が表示したい何SQL(..プラスの悪い英語のため申し訳ありません)合計金額にここに新しい

Product: 

ProductID | Product | Price 
____________________________ 
1   | walnuts | 16 
2   | cashew | 25 
3   | peanuts | 4 

Sells (each product kilograms sold): 

Day | walnuts | cashew | hazelnut 
__________________________________ 
1 | 2  | 3  | 1 
2 | 8  | 6  | 25 
3 | 1  | 3  | 12 

を合計であります2日目に獲得したお金(たとえば)だから私はそれをどのように計算できますか?

+1

テーブルデザインを変更する必要があります。値を使用しないでください。 –

+2

これがSQL Serverの場合は、簡単に行うために 'UNPIVOT'節を使用できますが、いずれの場合でも値を列名として使用したくない場合があります。 –

+0

ねえ..私は推測しますが、私は今すぐ立ち往生しています:/任意の提案? –

答えて

2

あなたの設計方法は良くありません。

**Item table:** 

    product_id | product_name | price 
    __________________________________ 
    1   | Some1  | 20 
    2   | Some2  | 30 
    3   | Some3  | 40 

    **sale table :** 

    sale_id | product_id | quantity 
    __________________________________ 
    1  | 2   | 2 
    2  | 1   | 1 
    3  | 3   | 2 

今すぐクエリを適用します。

SELECT sale.quantity*item.price as TOTAL FROM item,sale WHERE item.product_id=sale.product_id; 

あなたはより多くの列を持っている場合、あなたは複数のフィルタを適用することができます。

0

これはあまり保守的ではありませんが、実際のデータで何らかの理由で手で計算したくない場合は、このパターンが有効です。 (実際のデータではテストされていませんが、うまくいけば十分行くことができます)

select 
    s.Day, 
    p.Product, 
    SUM(
     CASE p.Product 
      WHEN 'walnuts' THEN p.Price * s.walnuts 
      WHEN 'cashew' THEN p.Price * s.cashew 
      WHEN 'peanuts' THEN p.Price * s.peanuts 
     END 
    ) Total 
from Product p full join Sells s 
group by s.Day, p.Product 
0
SELECT SUM(prince) 
FROM (
    SELECT CASE 
     WHEN p.product = "walnuts" 
      THEN (s.walnuts * p.price) 
     WHEN p.product = "cashew" 
      THEN (s.cashew * p.price) 
     WHEN p.product = "hazelnut" 
      THEN (s.hazelnut * p.price) 
     ELSE NULL 
      END AS price 
    FROM sells s 
    JOIN product p 
    WHERE Day = 2 
); 
2

1.変更し、あなたのテーブルstructur

あなたのdbテーブルの構造は良くありません。 製品の品種をカラムとして使用するのは方法ではありません。むしろ構造、次の使用:

Product: 

ProductID | Product | Price 
____________________________ 
1   | walnuts | 16 
2   | cashew | 25 
3   | peanuts | 4 

Sells (each product kilograms sold): 

Day | ProductID | Amt | Price 
__________________________________ 
1 | 1   | 2  | 15 
1 | 2   | 3  | 25 
1 | 3   | 1  | 4 
2 | 1   | 8  | 16 
2 | 2   | 6  | 23 
2 | 3   | 25  | 5 
3 | 1   | 1  | 16 
3 | 2   | 3  | 25 
3 | 3   | 12  | 4 

実際の販売価格は、日ごとに変わることができるので、私は、セルズテーブルに価格の列を置きます。

この構造のテーブルを一度集計すると、グループ化することができます。続き は、MySQLのクエリです:

SELECT SUM(Amt * Price) AS total FROM Sells WHERE Day=2 GROUP BY Day 

あなたは、それ自体が製品に昼と製品ごとに詳細を確認したい場合は、次のよう試すことができます。

SELECT p.ProductID, p.Product, SUM(s.Amt * s.Price) AS total 
    FROM Sells AS s 
    LEFT JOIN Product AS p ON s.ProductID = p.ProductID 
WHERE s.Day=2 GROUP BY s.Day, s.Product 

2.つもりはない変更された場合、その後...

@Kanagaraj Dhanapalの答えはあなたのものになります。

関連する問題