使用sql进行多次计数

时间:2015-04-14 18:27:33

标签: sql sql-server

我有两个表格gagesschedule,并且它们已加入company和序列号(gage_sn)。

我试图获得每个月,未来三个月的总计数,以及三个月的累计总数,如下所示:

type              this month     next month     two month from now     total
----              ----------     ----------     ------------------     -----
indicators            4              8                  2               14
calipers              0              16                 16              32
...

我目前有以下内容可以按类型获得本月到期的量具总数:

 SELECT G.GAGE_TYPE, COUNT(G.GAGE_TYPE)
   FROM GAGES AS G
        LEFT OUTER JOIN SCHEDGI AS S ON S.COMPANY = G.COMPANY AND S.GAGE_SN = G.GAGE_SN
  WHERE DATEPART(m, S.SCHED_DUE_DATE) = DATEPART(m, DATEADD(m, +2, GETDATE()))
    AND DATEPART(yyyy, A.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +2, GETDATE()))
    AND S.SCHED_TYPE = 'CALIBRATION'
    AND G.COMPANY = 'ABC COMPANT'
    AND G.ISACTIVE = '1'
    AND G.EVENT_STATUS <> 'MSI'
    AND G.EVENT_STATUS <> 'AWREP'
    AND G.EVENT_STATUS <> 'LOST'
    AND G.EVENT_STATUS <> 'OOT'
    AND G.EVENT_STATUS <> 'CAL.'
    AND G.EVENT_STATUS <> 'REPAIR'
    AND G.EVENT_STATUS <> 'RETOOL'
    AND G.EVENT_STATUS <> 'SCRAP'
  GROUP BY G.GAGE_TYPE
  ORDER BY G.GAGE_TYPE

如何修改SQL以获得所需的结果?

4 个答案:

答案 0 :(得分:1)

它并不是特别优雅,但是没有做转轴,你可以使用一些案例陈述和总和。

由于COUNT()返回GROUP BY中的行数,因此它仅对一个分组非常有用。

SELECT 
  GAGES.GAGE_TYPE, 
  SUM(CASE 
    WHEN (DATEPART(m, SCHEDGI.SCHED_DUE_DATE) = DATEPART(m, getdate())
         AND ( DATEPART(yyyy, SCHEDGI.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +2, getdate()))) THEN 1
    ELSE 0
  END) AS 'ThisMonth',
  SUM(CASE 
    WHEN (DATEPART(m, SCHEDGI.SCHED_DUE_DATE) = DATEPART(m, DATEADD(m, +1, getdate())))
         AND ( DATEPART(yyyy, SCHEDGI.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +2, getdate()))) THEN 1
    ELSE 0
  END) AS 'OneMonths',
  SUM(CASE 
    WHEN (DATEPART(m, SCHEDGI.SCHED_DUE_DATE) = DATEPART(m, DATEADD(m, +2, getdate())))
         AND ( DATEPART(yyyy, SCHEDGI.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +2, getdate()))) THEN 1
    ELSE 0
  END) AS 'TwoMonths'
  --COUNT(GAGES.GAGE_TYPE)
FROM 
  GAGES GAGES 
LEFT OUTER JOIN 
  SCHEDGI SCHEDGI 
ON  
  (SCHEDGI.COMPANY = GAGES.COMPANY) AND (SCHEDGI.GAGE_SN = GAGES.GAGE_SN)
WHERE  
 ( SCHEDGI.SCHED_TYPE = 'CALIBRATION' )
  AND ( GAGES.COMPANY = 'ABC COMPANT' )
  AND ( GAGES.ISACTIVE = '1' )
  AND ( GAGES.EVENT_STATUS <> 'MSI')
  AND ( GAGES.EVENT_STATUS <> 'AWREP' )
  AND ( GAGES.EVENT_STATUS <> 'LOST' )
  AND ( GAGES.EVENT_STATUS <> 'OOT' )
  AND ( GAGES.EVENT_STATUS <> 'CAL.' )
  AND ( GAGES.EVENT_STATUS <> 'REPAIR' )
  AND ( GAGES.EVENT_STATUS <> 'RETOOL' )
  AND ( GAGES.EVENT_STATUS <> 'SCRAP' )
GROUP BY  
  GAGES.GAGE_TYPE
ORDER BY 
  GAGES.GAGE_TYPE

答案 1 :(得分:0)

你可能需要做这样的事情:

SELECT 
  GAGES.GAGE_TYPE, 
  sum(case when 
    SCHED_DUE_DATE >= 'XXX' and 
    SCHED_DUE_DATE < 'YYY' then 1 else 0 end) CurrMonth,
  sum(case when 
    SCHED_DUE_DATE >= 'YYY' and 
    SCHED_DUE_DATE < 'ZZZ' then 1 else 0 end) NextMonth,
  ...
    sum(1) as Total

你需要将XXX和YYY替换为当月的开始日期和结束日期,将ZZZ替换为下个月的结束日期,但你可能有了这个想法。

答案 2 :(得分:0)

我假设你的表中包含一个告诉月份的列。让该列命名为“月份”。 你需要把它放在你的group by子句中。

group by GAGES.GAGETYPE , month

答案 3 :(得分:0)

首先,谢谢。你的公会帮助很大。

这是我在阅读你发帖后想出来的: 选择   GAGES.GAGE_TYPE,

SUM(情况下(DATEPART(m,SCHEDGI.SCHED_DUE_DATE)= DATEPART(m,DATEADD(m,+ 0,getdate()))和(DATEPART(yyyy,SCHEDGI.SCHED_DUE_DATE)= DATEPART(yyyy,DATEADD) (m,+ 0,getdate())))然后1 ELSE 0 END)作为'ThisMonth',  SUM(情况下(DATEPART(m,SCHEDGI.SCHED_DUE_DATE)= DATEPART(m,DATEADD(m,+ 1,getdate()))和(DATEPART(yyyy,SCHEDGI.SCHED_DUE_DATE)= DATEPART(yyyy,DATEADD(m, +1,getdate())))然后1 ELSE 0 END)AS'NextMonth',  SUM(情况下(DATEPART(m,SCHEDGI.SCHED_DUE_DATE)= DATEPART(m,DATEADD(m,+ 2,getdate()))和(DATEPART(yyyy,SCHEDGI.SCHED_DUE_DATE)= DATEPART(yyyy,DATEADD(m, + 2,getdate())))那么1节0结束)作为'TwoMonth',  COUNT(GAGES.GAGE_TYPE) 从   GAGES GAGES LEFT OUTER JOIN   SCHEDGI SCHEDGI ON
  (SCHEDGI.COMPANY = GAGES.COMPANY)和(SCHEDGI.GAGE_SN = GAGES.GAGE_SN)

WHERE
 (SCHEDGI.SCHED_TYPE ='CALIBRATION')

   AND ( DATEPART(m, SCHEDGI.SCHED_DUE_DATE) >= DATEPART(m, DATEADD(m, +0, getdate()))) AND ( DATEPART(yyyy, SCHEDGI.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +0, getdate())))
   AND ( DATEPART(m, SCHEDGI.SCHED_DUE_DATE) <= DATEPART(m, DATEADD(m, +2, getdate()))) AND ( DATEPART(yyyy, SCHEDGI.SCHED_DUE_DATE) = DATEPART(yyyy, DATEADD(m, +2, getdate())))

AND(GAGES.COMPANY ='ABC COMPANY')

AND(GAGES.ISACTIVE ='1')

AND(GAGES.EVENT_STATUS&lt;&gt;'MSI')

AND(GAGES.EVENT_STATUS&lt;&gt;'AWREP')

AND(GAGES.EVENT_STATUS&lt;&gt;'LOST')

AND(GAGES.EVENT_STATUS&lt;&gt;'OOT')

AND(GAGES.EVENT_STATUS&lt;&gt;'CAL。')

AND(GAGES.EVENT_STATUS&lt;&gt;'REPAIR')

AND(GAGES.EVENT_STATUS&lt;&gt;'RETOOL')

AND(GAGES.EVENT_STATUS&lt;&gt;'SCRAP')

GROUP BY
  GAGES.GAGE_TYPE

ORDER BY   GAGES.GAGE_TYPE

它完全按我需要的方式工作两个。