2015-04-14 54 views
-1

我有兩個表,gagesschedule,他們加入他們的company和序列號(gage_sn)。與sql重複計數

我試圖得到一個總數每個月,在接下來的三個月,共三個月累計象下面這樣:

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來獲得期望的結果?

+1

您是否考慮過將您的'EVENT_STATUS'合併爲使用'IN'子句? – Kermit

+0

你的SQL似乎不正確。特別是'GAGE_TYPE),(FROM')我認爲這是一個語法錯誤,你能證實你已經發布了工作的SQL嗎? – paqogomez

回答

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與結束日期下個月,但你可能有這個想法。

1

這不是特別優雅,但缺少一個數據透視表,你可以使用一些case語句和一個和。

由於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 
0

我假設你的表中包含一個關於月份的列。讓該列被命名爲「月」。 你需要把它放在你的group by子句中。

group by GAGES.GAGETYPE , month 
0

首先,謝謝。你的公會幫助很大。

這是我讀你的帖子後,想出了: 選擇 GAGES.GAGE_TYPE,

SUM(CASE WHEN(DATEPART(男,SCHEDGI.SCHED_DUE_DATE)= DATEPART(男,DATEADD(M + 0,getdate())))AND(DATEPART(yyyy,SCHEDGI.SCHED_DUE_DATE)= DATEPART(yyyy,DATEADD(m,+ 0,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,+1 ,getdate())))THEN 1 ELSE 0 END)AS'NextMonth', SUM(CASE WHEN(DATEPART(m,SCHEDGI.SCHED_DUE_DATE)= DATEPART(m,DATEADD(m,+2,getdate()))) AND(DATEPART(yyyy,S CHEDGI.SCHED_DUE_DATE)= DATEPART(YYYY,DATEADD(M,2,GETDATE())))THEN ELSE 1 0 END)AS 'TwoMonth', COUNT(GAGES.GAGE_TYPE) FROM 測厚儀計 LEFT OUTER JOIN SCHEDGI SCHEDGI ON
(SCHEDGI.COMPANY = GAGES.COMPANY)AND(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公司')

AND(GAGES。ISACTIVE = '1')

AND(GAGES.EVENT_STATUS <> 'MSI')

AND(GAGES.EVENT_STATUS <> 'AWREP')

AND(GAGES.EVENT_STATUS <> '丟失' )

AND(GAGES.EVENT_STATUS <> 'OOT')

AND(GAGES.EVENT_STATUS <> 'CAL。')

AND(GAGES.EVENT_STATUS <> '修復')

AND(GAGES.EVENT_STATUS <> '重新裝備')

AND(GAGES.EVENT_STATUS <> '廢料')

GROUP BY
GAGES.GAGE_TYPE

ORDER BY GAGES.GAGE_TYPE

它的工作方式完全是我需要它的兩種方式。