你的SQL非常不尋常。 Informix服務器是困惑的CASE表達式是一個聚合或不 - 還有我。至於寫的,你會做最好重寫查詢爲:
SELECT mymonth, Header1
FROM (SELECT MONTH(startdatetime) AS mymonth,
COUNT(somecolumn2) AS Header1
FROM MyTable
WHERE YEAR(startdatetime) = 2013
AND SomeColumn = 2
GROUP BY startdatetime
) AS x
-- GROUP BY Header1;
;
沒有理由爲(註釋掉)我可以看到的外層GROUP BY子句。考慮下面的測試數據:
CREATE TEMP TABLE MyTable
(
startdatetime DATE NOT NULL,
somecolumn INTEGER NOT NULL,
somecolumn2 VARCHAR(10)
);
INSERT INTO MyTable VALUES('2013-03-01', 2, NULL);
INSERT INTO MyTable VALUES('2013-03-02', 2, 'Elephant');
INSERT INTO MyTable VALUES('2013-03-03', 2, 'Rhinoceros');
INSERT INTO MyTable VALUES('2013-03-04', 1, 'Elephant');
INSERT INTO MyTable VALUES('2013-03-05', 3, 'Rhinoceros');
查詢的輸出是:
mymonth header1
SMALLINT DECIMAL(15,0)
3 0
3 1
3 1
不過,我懷疑你已經做了一些查詢最小化來說明這個問題(如果是這樣,謝謝),事實上你的主要子查詢會有一些類似的CASE表達式,而不僅僅是一個。在這種情況下,應該重寫CASE表達和聚集沿着這些路線:
SELECT mymonth, Header1
FROM (SELECT MONTH(startdatetime) AS mymonth,
COUNT(CASE WHEN MyTable.somecolumn = 2 THEN somecolumn2 END) AS Header1
FROM MyTable
WHERE YEAR(startdatetime) = 2013
GROUP BY mymonth
) AS x
;
對於相同的樣本數據,這產生了:
mymonth header1
SMALLINT DECIMAL(15,0)
3 2
鑑於所使用IBM的Informix 11.50代替11.70或12。10,你可能需要使用這個變化來獲得聚合完成:
SELECT MonthNum, COUNT(Header1) AS Header1
FROM (SELECT MONTH(startdatetime) AS MonthNum,
CASE WHEN MyTable.somecolumn = 2 THEN somecolumn2 END AS Header1
FROM MyTable
WHERE YEAR(startdatetime) = 2013
) x
GROUP BY MonthNum;
輸出:
monthnum header1
SMALLINT DECIMAL(15,0)
3 2
的基本思想是使用CASE表達式生成你想要的值子查詢的Header1列,然後將聚合應用於子查詢的結果(而不是在子查詢中進行聚合)。我還沒有證實,這將在11.50(它在11.70.FC6中)有效,但它會有一個不錯的機會。
最後一個查詢正是我要找的,但有一個很大的問題 我的Informix 11.50版本而據我看到它不支持內case語句計數函數我錯了嗎?如果有的話,是否有任何解決方法。並感謝您的幫助:) – Avicena00
總是說你的版本號 - 規則改變。我使用IBM Informix 11.70進行了測試。截至2013年3月26日,IBM Informix 12.10是最新版本。迄今最簡單的解決方案是升級;後來的版本在覈心SQL語言中有許多類似的改進。我會仔細研究一些更新答案的方法。 –
一如既往,喬恩的答案是詳細和有益的。我也更新了我的答案,以及如何一次完成多項計數的變化。我們有$ 11.5的工作,正在遷移到11.7,我知道這種方法工作正常。 – RET