【问题标题】:MySQL- Getting a SUM when a variable inside it doesn't existMySQL-当其中的变量不存在时获取 SUM
【发布时间】:2017-04-19 17:29:06
【问题描述】:

第一次发帖!

因此,作为 SQL 和数据库领域的年轻学徒,我正在努力为企业创建一个数据库来管理订单/商品/价格等。我想从 3 个链接表 {items,prices,discounts }(见底部表格)计算并显示商品的总价。作为一项规则,折扣列不应为零(因为我们只希望在表 discounts 中具有实际折扣的条目,而不是 0)

我想从以下条目中显示所有,但我的视图显示有折扣的条目。

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`)
);

很抱歉没有提供架构。不知道怎么做。

希望我没有浪费您太多时间!你是我的英雄。

【问题讨论】:

  • 措辞优美的问题,清晰明了,包含所有必要的支持细节。您将在 StackOverflow 中走得更远。

标签: mysql sql view sum inner-join


【解决方案1】:

您只需要一个左连接 - 这将抓取所有带有价格的商品,即使它们没有折扣。您使用 COALESCE 将 NULL 折扣替换为有效数字。

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;

您对 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;

【讨论】:

  • 您好,感谢您的快速回复。现在它确实显示了条目“404”,但总值为 NULL,
  • 等一下,我看到您已编辑以添加选择。我可以解决这个问题。
  • 当我想到这一点时 - 为什么是 SUM?您是否有多个具有相同 item_ID 的商品?
  • 有效!我不需要 SUM ,我只是不知道还能用什么。(不重复)
  • 0 的 COALESCE 真的运行了吗?我认为这会引发除以零错误。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多