我一直在寻找解决这个问题的方法,但是还不太清楚。
我正在处理一个包含供应商,项目,零件,发货日期和到达日期的表。我需要通过单个查询显示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
,依此类推。感谢您的任何建议!
答案 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标准的日期常量。