繁体   English   中英

如何在“具有子句”中使用列选择,而不在SQL Server中的“按子句”中使用

[英]How to use column selection in Having Clause but not in Group By Clause in SQL Server

我一直碰到这个问题,我知道必须有一个简单的解决方案,但我找不到。

我想获取某些日期之间每个零件的序列号。 因此,没有选择日期,它看起来像这样。

SELECT 
    Part_Name,
    COUNT(DISTINCT Serial_No) AS 'Serial Frequency'
FROM Inventory
GROUP BY Part_Name

我得到每个零件的序列号。

part1    55    
part2    32   
part3    48 
etc etc

因此,现在我希望在两个日期之间进行选择。 我知道我需要使用“ Having”,但是这迫使我将其逐个添加到组中,然后它不再为我提供总数,而是为每个部分单独计数。 IE浏览器

SELECT 
    Part_Name,
    COUNT(DISTINCT Serial_No) AS 'Serial Frequency'
FROM Inventory
GROUP BY Part_Name, Grade_Date
HAVING Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01'

输出:

part1 1  
part1 1  
part1 1   
part2 1  
part2 1 
etc etc

我在这里错过了什么明显的事情,因为可以做到这一点? 如果我不包括它,则会出现此错误

HAVING子句中的“ Inventory.Grade_Date”列无效,因为它既不在聚合函数中也不在GROUP BY子句中。

使用where子句,因为您是在比较实际值而不是汇总值。

SELECT 
Part_Name,
Grade_Date,
COUNT(DISTINCT Serial_No) AS 'Serial Frequency'
FROM Inventory
WHERE Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01'
GROUP BY Part_Name,Grade_Date

您希望在进行聚合之前Grade_Date进行过滤,并且您不应该在GROUP BYSELECT包括Grade_Date

SELECT Part_Name, COUNT(DISTINCT Serial_No) AS SerialFrequency
FROM Inventory
WHERE Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01'
GROUP BY Part_Name;

评论:

  • 我希望第一个比较是>=
  • 不要使用需要转义字符的列别名。
  • 不要使用单引号定义列别名; 仅对字符串和日期常量使用单引号。
  • 如果不需要DISTINCT ,则将其删除。 DISTINCT会产生额外的计算开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM