2016-11-29 44 views
0

我试着算了一下。在30,60至90天以上收到的账单。陈年报告30,60,90以上

这里是我的T-SQL查询:

SELECT 
    costcentreid, 
    'Current' = CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) < 30 
         THEN COUNT(PVNo) 
       END, 
    '30_days' = CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) BETWEEN 30 AND 60 
         THEN COUNT(PVNo) 
       END, 
    '60_days' = CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) BETWEEN 60 AND 90 
         THEN COUNT(PVNo) 
       END, 
    '90_plus' = CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) > 90 
         THEN COUNT(PVNo) 
       END 
FROM 
    SPRGMMS..PVRegister 
GROUP BY 
    CostCentreId 

当我运行它,我得到一个错误:

Msg 8120, Level 16, State 1, Line 2
Column '[DB]..PVRegister.BillDate' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

请帮助

+3

请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql - 查询 – Strawberry

回答

1

需要外聚集

SELECT 
    costcentreid, 
    COUNT(CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) < 30 
         THEN PVNo 
       END) as 'Current', 
    COUNT(CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) BETWEEN 30 AND 60 
         THEN PVNo 
       END) as '30_days', 
    COUNT(CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) BETWEEN 60 AND 90 
         THEN PVNo 
       END) as '60_days', 
    COUNT(CASE 
        WHEN DATEDIFF(DAY, BillDate, Getdate()) > 90 
         THEN PVNo 
       END) as '90_plus' 
FROM 
    SPRGMMS..PVRegister 
GROUP BY CostCentreId 
+0

嗨,感谢它的工作。 – AGS

+1

@AGS小心。你有重复计算的风险。 30和60和60和90.任何60天将在两个桶 –

+0

如果这个答案帮助你,请考虑[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an - 工作)。接受的答案奖励贡献者并帮助他人解决类似的问题,以找到工作答案。 –

0
SELECT 
    costcentreid, 
    SUM(CASE WHEN d = 1 THEN 1 ELSE 0 END) AS '30_days' 
    SUM(CASE WHEN d = 2 THEN 1 ELSE 0 END) AS '60_days', 
    SUM(CASE WHEN d = 3 THEN 1 ELSE 0 END) AS '90_days', 
FROM (
    SELECT PVNo, costcentreid, DATEDIFF(DAY, BillDate, Getdate()))/30 AS d FROM SPRGMMS..PVRegister 
) T 
WHERE d <= 3 
GROUP BY costcentreid