2012-02-14 58 views
0

期間是過去MSSQL伯爵日期我有一個MSSQL的服務器上的表格有幾個字段:是GROUP BY

fieldA,fieldB,fieldC,DateTimeField 

我現在做一個選擇是這樣的:

SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
FROM table 
GROUP BY fieldA, fieldB, fieldC 

這工作得很好。

現在我想要統計過去或未來另一列中的所有DateTimeField

有沒有perfomant的方法? (甚至可能沒有加入)?

日Thnx,哈利

+0

什麼,你用'是在past' DateTimeFields意思? – 2012-02-14 13:47:22

回答

5

只需添加一個COUNT/CASE構造。
你得到NULL從隱含ELSE這COUNT忽略

COUNT(CASE WHEN DateTimeField > GETDATE() THEN 1 END) AS FutureDates, 
COUNT(CASE WHEN DateTimeField < GETDATE() THEN 1 END) AS PastDates, 
+2

+1比我的回答好得多! – Curt 2012-02-14 13:48:42

+0

這太神奇了。 – Harry 2012-02-14 13:49:39

1

你可以使用2次查詢得到這個結果集:

SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
,(SELECT COUNT(DateTimeField) 
    FROM table 
    WHERE DateTimeField<GETDATE() 
    AND t.fieldA=fieldA 
    AND t.fieldB=fieldB 
    AND t.fieldC=fieldC) as PastDates 
,(SELECT COUNT(DateTimeField) 
    FROM table 
    WHERE DateTimeField>=GETDATE() 
    AND t.fieldA=fieldA 
    AND t.fieldB=fieldB 
    AND t.fieldC=fieldC) as FutureDates 
FROM table t 
GROUP BY fieldA, fieldB, fieldC 
1

像這樣的東西?:

SELECT fieldA, fieldB, fieldC, 
     MAX(DateTimeField), MIN(DateTimeField), 
     (COUNT(*) - COUNT(DateTimeField)) as DateTimeFieldIsNull, 
     SUM(CASE WHEN DateTimeField < GETDATE() THEN 1 END) DateTimeFieldInThePast, 
     SUM(CASE WHEN DateTimeField > GETDATE() THEN 1 END) DateTimeFieldInTheFuture 
FROM table 
GROUP BY fieldA, fieldB, fieldC 
2
SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
, COUNT(CASE WHEN DateTimeField > GETDATE() THEN 1 END) AS 'ABC' 
, COUNT(CASE WHEN DateTimeField < GETDATE() THEN 1 END) AS 'XYZ' 
FROM table 
GROUP BY fieldA, fieldB, fieldC; 
+0

opps ...有人已經發布了類似的解決方案:) – Scorpion 2012-02-14 13:53:54