2017-04-19 3 views
2

ここに最初の投稿!MySQL- SUMが内部の変数が存在しないときに取得する

SQLとデータベースの若いパダワンのように、私は注文/商品/価格などを管理するためのビジネス用のデータベースを作成しています。私は3つのリンクテーブル{アイテム、価格、 discounts}(一番下の表を参照)は、アイテムの合計価格を計算して表示します。 (我々は唯一のテーブルでは、実際の割引ではなく、0とdiscountsエントリをしたいので)原則として、割引列には、私はそれらのすべてを表示する次のエントリから

ゼロではありませんが、私の見解のみが値引きを示しています。

insert into items (`item_id`,`item_name`, `item_quantity`) values 
(102,'item1',20), 
(103,'item2',20), 
(404,'item3',20); # <-- It won't be shown if I do SELECT * FROM view; 

insert into discounts (`item_id`,`discount`) values 
(102,50), 
(103,25); 

insert into prices (`item_id`,`price`) values 
(102,100), 
(103,100), 
(404,100); 

そして、ここで私のビューである:ここでは

CREATE VIEW ItemsPrice AS 
SELECT 
    i.item_id, 
    i.item_name, 
    SUM((1-d.discount/100)*p.price*i.item_quantity) 

FROM 
    items AS i 
    INNER JOIN 
     prices AS p ON i.item_id=p.item_id 
    INNER JOIN 
     discounts AS d ON (p.item_id=d.item_id)  
GROUP BY item_id 
ORDER BY total; 

は私のテーブルには、(念のため、私は彼らが間違って作られた)次のとおりです。

DROP TABLE IF EXISTS `items`; 
CREATE TABLE `items` (
    `item_id` int(30) NOT NULL, 
    `item_name` varchar(35) NOT NULL, 
    `item_quantity` double(25,0) , 
    PRIMARY KEY (`item_id`) 

); 
#2======= 
DROP TABLE IF EXISTS `prices`; 
CREATE TABLE `prices` (
    `item_id`int(30) NOT NULL, 
    `price` decimal(30,2) NOT NULL, 

    PRIMARY KEY (`item_id`), 
    CONSTRAINT `prices_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items` (`item_id`) 
); 
#3======= 
DROP TABLE IF EXISTS `discounts`; 
CREATE TABLE `discounts` (
    `item_id` int(30) NOT NULL, 
    `discount` int(3) NOT NULL, 
    PRIMARY KEY (`item_id`), 
    CONSTRAINT `discount_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items` (`item_id`) 
); 

スキーマを提供していないため申し訳ありません。それを作る方法を知らない。

私はあなたの時間を大いに浪費しませんでした!あなたは私のヒーローです。

+0

素敵な表現の質問:COALESCEと

SELECT i.item_id, i.item_name, COALESCE(d.discount,0) as discount, p.price, i.item_quantity FROM items AS i INNER JOIN prices AS p ON i.item_id=p.item_id LEFT JOIN discounts AS d ON (p.item_id=d.item_id) GROUP BY item_id ORDER BY total; 

あなたのクエリ。あなたはStackOverflowで遠くに行くでしょう。 –

答えて

1

あなたは左の結合が必要です - これは値引きのない商品でもすべての商品を取り込みます。 NULL割引を有効な数値に置き換えるには、COALESCEを使用します。必要なすべてのサポート詳細は、明確かつポイントに

SELECT 
    i.item_id, 
    i.item_name, 
    (1-COALESCE(d.discount,0)/100)*p.price*i.item_quantity) as totalAmount 
FROM 
    items AS i 
    INNER JOIN 
     prices AS p ON i.item_id=p.item_id 
    LEFT JOIN 
     discounts AS d ON (p.item_id=d.item_id)  
GROUP BY item_id 
ORDER BY total; 
+0

こんにちは、速い返信をありがとう。 これは実際にエントリ '404'を表示しますが、NULLの合計値は – Spoting

+0

です。選択を追加するために編集が表示されます。私はそれを修正することができます。 –

+0

が更新されました...まだ数学の微調整が必​​要です。私は思っている... –

関連する問題