查询结果的区别和计数

时间:2018-07-23 18:33:19

标签: sql oracle

我一直在寻找解决这个问题的方法,但是还不太清楚。

我正在处理一个包含供应商,项目,零件,发货日期和到达日期的表。我需要通过单个查询显示2017年交付的每个项目的零件数。因此,基本上,我希望它在一个栏中显示ProjectNo,然后显示零件数。我可以运行这样的查询:

SELECT ProjectNo, PartNo
FROM SHIPMENTS
WHERE ArriveDate
BETWEEN 
TO_DATE ('1/1/17', 'MM/DD/YYYY') 
AND 
TO_DATE ('1/1/18', 'MM/DD/YYYY');

这将满足我的需求,但在ProjectNo列中有重复项,并且显然没有PartNo的计数。因此,我尝试以下操作:

SELECT DISTINCT ProjectNo, COUNT(PartNo)
FROM SHIPMENTS
WHERE ArriveDate
BETWEEN 
TO_DATE ('1/1/17', 'MM/DD/YYYY') 
AND 
TO_DATE ('1/1/18', 'MM/DD/YYYY');

由于使用了COUNT函数,这给我一个“不是单个组函数”的错误。如何获得所需的结果,即:

P1   |   3
P2   |   4
P3   |   7

,依此类推。感谢您的任何建议!

3 个答案:

答案 0 :(得分:3)

删除DISTINCT,因为当您GROUP BY 某事时它没有任何意义,并且您应该按未汇总的列GROUP BY的值,即< strong> PROJECTNO 。

SELECT ProjectNo, 
       COUNT(PartNo)
FROM SHIPMENTS
WHERE ArriveDate BETWEEN TO_DATE ('1/1/17', 'MM/DD/YYYY') 
                     AND TO_DATE ('1/1/18', 'MM/DD/YYYY')
GROUP BY projectno;

[编辑]

如果不需要WHERE,请将其删除。其余的应该没问题:

SELECT PartNo, SUM(ArriveDate - ShipDate) AS Duration 
FROM SHIPMENTS 
GROUP BY PartNo

答案 1 :(得分:2)

SELECT ProjectNo, COUNT(PartNo)
FROM SHIPMENTS
WHERE ArriveDate
BETWEEN 
TO_DATE ('1/1/17', 'MM/DD/YYYY') 
AND 
TO_DATE ('1/1/18', 'MM/DD/YYYY')
group by ProjectNO;

答案 2 :(得分:0)

我相信您想要的逻辑是:

SELECT ProjectNo, COUNT(PartNo)  -- use `COUNT(*)` if PARTNO is never NULL
FROM SHIPMENTS
WHERE ArriveDate >= DATE '2017-01-01' AND ArriveDate < DATE '2018-01-01'
GROUP BY ProjectNo;

请注意,这不使用BETWEEN。据推测,您不会在2018年1月1日到达。尽管Aaron Bertrand是为SQL Server编写的,但它有一个不错的博客,介绍了为什么不应该在日期/时间上使用BETWEEN What do BETWEEN and the devil have in common?

此外,它使用DATE关键字,允许使用ISO标准的日期常量。