首页 > 解决方案 > 连接多个表,然后根据 CASE 条件将其中一个表中的数据显示为单独的列

问题描述

我已经能够连接来自不同数据库的多个表,但我不知道如何使用案例标准将其中一个表中的数据显示到单独的列中。

select p.ProductID as pid,
    s.ItemCode as icode,
    s.ItemDescription,
    s.UOM,
    s.AvgCost,
    b.ST as stockAvl,
    CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 60 DAY) AND NOW() THEN SUM(c.qty) ELSE 0 END as s60,
    CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 90 DAY) AND NOW() THEN SUM(c.qty) ELSE 0 END as s90,
    CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 180 DAY) AND NOW() THEN SUM(c.qty) ELSE 0 END as s180,
    CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 365 DAY) AND NOW() THEN SUM(c.qty) ELSE 0 END as s365
FROM db_inventory.StockMain_T s
left outer join db_inventory.stkbalance_T b on s.ItemCode=b.itemid
left outer join db_main.SaleItems_T c on c.ItemID=s.ItemCode
left outer join db_inventory.ProductMaster_T p on p.ProductID=s.ProdID
group by icode
order by pid

上述查询有效,但与结果不一致。s60、s90、s180 和 s365 列未显示完整数据。结果仅显示少数项目的数据,而不是所有项目的数据,而这些项目的数据也记录到 SaleItems_T 表中,但结果显示这些项目的数据为 0。似乎无法理解我在查询中做错了什么。

这是查询的结果。为简化起见,我从上面的原始查询中删除了几列,并保留了 5 列。ttlsales 显示自开始以来数据库历史中所有销售额的总和。s300 和 s900 除一项外为空白。s9000 使用时也是整个历史

NOW()-INTERVAL 9000 DAY

所以它也显示了整个历史。问题在于列 s300 和 s900 不显示数据,而数据存在于 saleitems 表中。

在此处输入图像描述

标签: mysql

解决方案


CASE汇总每个语句的返回值:

SUM(CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 60 DAY) AND NOW() THEN c.qty ELSE 0 END) as s60,
SUM(CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 90 DAY) AND NOW() THEN c.qty ELSE 0 END) as s90,
SUM(CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 180 DAY) AND NOW() THEN c.qty ELSE 0 END) as s180,
SUM(CASE WHEN c.saledate BETWEEN DATE_SUB(NOW(),INTERVAL 365 DAY) AND NOW() THEN c.qty ELSE 0 END) as s365

推荐阅读