如何在有子句的情况下使用列选择,但在SQL Server中不在Group By子句中使用

时间:2016-07-06 00:06:27

标签: sql 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

所以现在我希望在两个日期之间选择它。我知道我需要使用Have但是这迫使我将它添加到分组中,然后它不再给我计数总数但每个部分单独。 I.E.

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

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

  

专栏&#39; Inventory.Grade_Date&#39;在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:0)

您希望在进行聚合之前按Grade_Date 进行过滤,并且不应在Grade_DateGROUP BY中包含SELECT:< / p>

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会产生额外的计算开销。