MySQL-当其中的变量不存在时获取 SUM

标签 mysql sql view sum inner-join

第一次发帖!

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

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

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

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

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

最佳答案

你只需要一个左连接——这将获取所有有价格的商品,即使它们没有折扣。您使用 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;

关于MySQL-当其中的变量不存在时获取 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43502398/

相关文章:

mysql - 如何根据两个字段之间的值比较生成结果集?

android - 如何在表格行上实现长按/滑动和删除 - android titanium?

AngularJS:如何在 AngularJS 中将数据从 View 传递到 Controller

MySQL 错误、事件连接、拒绝访问、无权限

php - 每个表单项作为 mySql 表中的新行

mysql - 查找候选键/ super 键

android - 如何为新 fragment 重用 fragment View

c# - Aspx C# MySQL 连接字符串未使用 web.Config 连接

php 类型 def 与绑定(bind)参数不匹配

sql - PLSQL、SQL*PLUS 获取当前用户名?