【问题标题】:Extract Specific Data After a aggregation (Or any other solution for the desired result)聚合后提取特定数据(或任何其他解决方案以获得所需结果)
【发布时间】:2017-01-13 17:04:33
【问题描述】:

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

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

我已设法选择特定“主要类别”的“销售额”,而所有其他“主要类别”(没有任何销售额)使用以下查询显示为零:

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

但是当我尝试通过 WHERE 子句或 HAVING 子句进一步将其 2016 年 分离时,它停止显示“main_category”当年销售额为零的名称。

我能想到的一件事是只提供 2016 年的查询发票 我试图通过做类似的事情来做到这一点,

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

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

其中确实显示了具有零值但增加了计算销售额的类别(从 2069 到 203151022.75)

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

我重复期望的结果是:在该年没有销售的主要类别应显示为零,并且年份为年/月/日

【问题讨论】:

  • 仅仅发布一个查询并期望其他人解决它是不可能发生的。我们需要更多信息来在这里提供任何真正的帮助。这是一个很好的起点。 spaghettidba.com/2015/04/24/… 如果您保留 where 子句的方式,您的整个查询逻辑将更改为仅返回匹配的行。我将重新开始您的整个查询并使用 Main_Category 作为您的基表。然后离开加入所有其他的东西。右连接即使是有经验的人也会感到困惑,对其他人来说却是彻头彻尾的慌乱。
  • 为什么要正确加入?

标签: sql-server join group-by aggregate-functions right-join


【解决方案1】:

正如 Sean 和 Eli 所说,不建议使用 RIGHT JOIN,您可以将其更改为 LEFT JOIN,或者像这样使用子查询:

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 

【讨论】:

  • 您提出子查询的建议对我的解决方案有所帮助。
【解决方案2】:

试试这个:

WHERE ISNULL(YEAR(i.trans_date), 1) = 2016

如果您在外连接上放置简单的等于条件,它将消除空值,这会给出您想要的零值行。 另请注意,类似:

WHERE YEAR(i.trans_date) = 2016

不可搜索,见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多