首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在聚合后提取特定数据(或任何其他解决方案以实现所需的结果)

在聚合后提取特定数据(或任何其他解决方案以实现所需的结果)
EN

Stack Overflow用户
提问于 2017-01-13 17:04:33
回答 2查看 44关注 0票数 0

我想选择2016年特定"main_category“的”销售总额“

(当年没有销售的主要类别应该显示为零)

我已经成功地选择了特定“主类别”的“销售”,使用下面的查询将所有其他"main_categories“(没有任何销售)显示为零:

代码语言:javascript
运行
复制
SELECT 
    mc.name,
    ISNULL(SUM(s.no_of_units * b.unit_price),0) AS tCatSales
FROM Sales s
INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
INNER JOIN Inventory inv ON inv.inventory_ID = s.inventory_ID
INNER JOIN Batch b ON b.batch_ID = inv.batch_ID
INNER JOIN Products p ON p.product_id = b.product_ID
INNER JOIN Category c ON c.category_ID = p.category_id
RIGHT JOIN Main_Category mc ON mc.cat_id = c.main_category
--WHERE YEAR(i.trans_date) = 2016
GROUP BY mc.name
--HAVING YEAR(i.trans_date)=2016

但是,当我试图在2016年进一步将其隔离开来时,它不再显示“”名称,即在今年零销量的"main_category“名称,无论是WHERE子句,还是有子句。

我能想到的一件事是只提供2016年的查询发票,我试着这样做,

替换行: INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id

with: INNER JOIN Invoice i ON i.invoice_ID IN (SELECT invoice_id FROM Invoice in2 WHERE Year(in2.trans_date)=2016)

哪个显示了零值的类别,但随着计算出的销售额的增加(从2069年增加到203151022.75)。

我知道这个添加有点不合逻辑,扰乱了整个内部连接,但到目前为止,这些都是我能想到或在网上找到的最接近的东西。

我重复所期望的结果是:在那一年中没有销售的主要类别应该显示为0,与给定的年份/月份/日期

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-06 20:43:51

正如Sean和Eli提到的,不推荐右联接,您可以将其更改为左联接,或者使用以下子查询:

代码语言:javascript
运行
复制
SELECT
    mc.name,
    tCatSales = ISNULL(
      (
        SELECT 
            SUM(s.no_of_units * b.unit_price) AS tCatSales
        FROM Sales s
        INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
        INNER JOIN Inventory inv ON inv.inventory_ID = s.inventory_ID
        INNER JOIN Batch b ON b.batch_ID = inv.batch_ID
        INNER JOIN Products p ON p.product_id = b.product_ID
        INNER JOIN Category c ON c.category_ID = p.category_id    
        WHERE mc.cat_id = c.main_category  
          AND YEAR(i.trans_date) = 2016
      ) , 0)
FROM Main_Category mc 
票数 0
EN

Stack Overflow用户

发布于 2017-09-06 20:10:55

试试这个:

代码语言:javascript
运行
复制
WHERE ISNULL(YEAR(i.trans_date), 1) = 2016

如果在外部联接上设置简单的相等条件,它将消除空值,这会给出你想要的零值行。还请注意,类似于:

代码语言:javascript
运行
复制
WHERE YEAR(i.trans_date) = 2016

是不可接受的,请参阅here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41639838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档