如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据
Posted
技术标签:
【中文标题】如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据【英文标题】:How to Filter Data in SQL Without Using Group By / Having Functions 【发布时间】:2022-01-04 06:57:33 【问题描述】:有一种情况,我正在尝试生成一个查询,该查询显示销售订单上的商品编号以及所有订单的未完成总数量。我可以这样做:
SELECT
SL.[Item No_],
SUM(SL.[Outstanding Quantity])
FROM [Database$Sales Header] SH
LEFT JOIN [Database$Sales Line] SL ON SL.[Document No_] = SH.[No_]
LEFT JOIN [Database$Items] I ON I.[No_] = SL.[Item No_]
GROUP BY
SL.[Item No_],
SH.[Document Type],
I.[Product Code]
HAVING
SH.[Document Type] = '1'
AND I.[Product Code] = 'SHIRT'
ORDER BY
SL.[Item No_]
上面的代码给了我一个项目#和数量的简单总结。在所有销售订单上。 我正在使用 HAVING 子句仅包含销售订单(文档类型) 并且仅限衬衫(产品代码)。
我遇到的问题是当我想排除特定客户时。
我尝试将:AND SH.[Customer No_] 'CUST1' 添加到 HAVING 子句,但如果这样做,SQL 将要求我将其添加到 GROUP BY 子句中。结果是我在之前总结的地方得到了重复的行,因为现在 SQL 正在按项目 # 和客户 # 报告未完成的数量,这不是我想要的。
所以我不确定如何在不将其放入 GROUP BY 的情况下排除该客户。
【问题讨论】:
【参考方案1】:请使用 where 子句过滤数据。
SELECT
SL.[Item No_],
SUM(SL.[Outstanding Quantity])
FROM [Database$Sales Header] SH
LEFT JOIN [Database$Sales Line] SL ON SL.[Document No_] = SH.[No_]
LEFT JOIN [Database$Items] I ON I.[No_] = SL.[Item No_]
where SH.[Customer No_] <> 'CUST1'
GROUP BY
SL.[Item No_],
SH.[Document Type],
I.[Product Code]
HAVING
SH.[Document Type] = '1'
AND I.[Product Code] = 'SHIRT'
ORDER BY
SL.[Item No_]
【讨论】:
以上是关于如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组
我可以在不存储 group by 和 order by value 的情况下加快此查询吗?