我有两个表格gages
和schedule
,并且它们已加入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以获得所需的结果?
答案 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
它完全按我需要的方式工作两个。