分组在SQL

时间:2016-07-22 09:47:18

标签: sql sql-server

我有这个:

 SELECT   ([Document No_]) 
 FROM [Verploegen POC$Sales Line]
 --WHERE [Shipment Date] = '2014-05-08' 
 GROUP BY [Document No_]
 --[Shipment Date]
 --[Document No_], 
 HAVING COUNT(*) > 1

并且给了我272160个结果。

但如果我这样做:

  SELECT   ([Document No_]), [Shipment Date] 
FROM [Verploegen POC$Sales Line]
--WHERE [Shipment Date] = '2014-05-08' 
GROUP BY [Document No_], [Shipment Date]
--[Shipment Date]
--[Document No_], 
HAVING COUNT(*) > 1

它返回:267661。

怎么可能?

谢谢

如果我这样做:

SELECT   ([Document No_]), [Shipment Date] 
FROM [Verploegen POC$Sales Line]
WHERE [Shipment Date] = '2012-01-01' 

我得到了36个结果。但有双打,就像这样:

V004180 2012-01-01 00:00:00.000
V004182 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000
V066594 2012-01-01 00:00:00.000

所以我尝试用双手去除双打。但是在这种情况下如何只返回带有标题的树结果(即唯一值):文件编号和装运日期?

谢谢

如果我这样做:

SELECT (  [Document No_]), [Shipment Date], COUNT(*) as count
FROM [Verploegen POC$Sales Line] 
WHERE [Shipment Date] = '2012-01-01'
GROUP BY [Document No_], [Shipment Date]


SELECT (  [Document No_]), COUNT(*) as count
FROM [Verploegen POC$Sales Line] 
WHERE [Shipment Date] = '2012-01-01'
GROUP BY [Document No_]

它将返回完全相同的结果

2 个答案:

答案 0 :(得分:1)

右键!

您正在执行两个不同的查询。

第一组仅用于Document_No,第二组用于两个字段,Document_No和装运日期

一个例子。

假设你有这个数据:

Document No | Shipment Date
    1       |    2015-01-01
    2       |    2015-01-01
    1       |    2016-01-01

第一个查询返回2个ROWS(按文档编号分组,因此第一行和第三行是collpased而第二行)

第二个查询返回3个ROWS(按Docvument No分组,发货日期是三个不同的组合)。

一个有趣的问题是......在你的表中,如果你有相同的文件号的更多行?为什么您对同一文件号有不同的发货日期?

答案 1 :(得分:1)

您有两个不同的查询,因此两个不同的结果集不应该是一个惊喜。在一个非常简单的例子中:

原始数据:

Document No |  Shipment Date
-----------------------------
    1       |  2016-07-22
    1       |  2016-07-23
    2       |  2016-07-22

如果你只按Document No进行统计分组,你会得到:

SELECT  [Document No], COUNT(*) AS Count
FROM    T
GROUP BY [Document No];

Document No |  Count
-----------------------------
    1       |  2
    2       |  1

因此,在应用HAVING COUNT(*) > 1之后,您只会留下Document No为1的记录。

如果您将发货日期添加到查询中:

SELECT  [Document No], [Shipment Date], COUNT(*) AS Count
FROM    T
GROUP BY [Document No], [Shipment Date];

Document No |  Shipment Date | Count
--------------------------------------
    1       |  2016-07-22    |   1
    1       |  2016-07-23    |   1
    2       |  2016-07-22    |   1

因此,在应用HAVING COUNT(*) > 1子句后,您没有任何行。这就是为什么第二个查询的行数少于第一个查询的原因。

顺便说一句,我强烈建议你停止用空格和符号创建对象名称。这有点主观,在我看来Pascal案例很好,我不知道DocumentNo是任何不易于[Document No_]的清晰,并且写得更容易。在最坏的情况下(我不喜欢它,但我知道它很受欢迎)你应该使用下划线而不是空格来分隔单词,所以你最终会得到Document_No。如果你刚刚继承了这个系统,而且要做出改变为时已晚,那么你至少应该把这些桌子的原创者从你的圣诞卡清单中拿走!