2013-03-29 65 views
1

什麼我根據這個查詢丟失:Informix的集團通過別名

SELECT mymonth, Header1 
FROM 
(
SELECT month(startdatetime) as mymonth, (CASE WHEN MyTable.somecolumn =2 THEN count(somecolumn2) END) as Header1 
FROM MyTable WHERE year(startdatetime)=2013 
group by startdatetime 

) x 
GROUP BY Header1 

我已經是Informix的不被支持的別名,但分組嘗試設置 GROUP BY 2時紅色的地方,有太多的錯誤 列標題1必須位於Group by子句中

回答

1

你的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中)有效,但它會有一個不錯的機會。

+0

最後一個查詢正是我要找的,但有一個很大的問題 我的Informix 11.50版本而據我看到它不支持內case語句計數函數我錯了嗎?如果有的話,是否有任何解決方法。並感謝您的幫助:) – Avicena00

+0

總是說你的版本號 - 規則改變。我使用IBM Informix 11.70進行了測試。截至2013年3月26日,IBM Informix 12.10是最新版本。迄今最簡單的解決方案是升級;後來的版本在覈心SQL語言中有許多類似的改進。我會仔細研究一些更新答案的方法。 –

+0

一如既往,喬恩的答案是詳細和有益的。我也更新了我的答案,以及如何一次完成多項計數的變化。我們有$ 11.5的工作,正在遷移到11.7,我知道這種方法工作正常。 – RET

3

這是您在該查詢中獲得的一些非常特殊的語法。我認爲這是造成該問題的CASE聲明。

什麼是實現這不是在這個更簡單的版本處理?

SELECT MONTH(startdatetime) AS mymonth, COUNT(*) AS header1 
    FROM MyTable 
    WHERE YEAR(startdatetime) = 2013 
    AND somecolumn = 2 
GROUP BY 1 

如果你試圖做一些事情比你放什麼與CASE聲明你的樣品中更時髦,那麼我建議你嘗試這樣的:

SELECT ...., SUM(DECODE(somecolumn, 2, 1, 0)) 

.. 。但是通常當你使用不同謂詞做多個SUM()s時,就會使用這種語法風格。


UPDATE

那裏有計數多個謂詞,我喜歡做這種方式:

SELECT .... 
    SUM(CASE WHEN col1 = 1 THEN 1 ELSE 0 END) AS count1, 
    SUM(CASE WHEN col3 = 7 AND col5 = 0 THEN 1 
      WHEN col3 = 5 AND col5 = 1 THEN 1 
      ELSE 0 END) AS count2 
    FROM .... 

這就給了你很大的靈活性來算很多的不同在1條SQL語句中的東西,只要它們是GROUP就是一樣。

+0

原因我沒有使用WHERE子句中的條件(somecolumn = 2),有更多的列必須計算,他們有不同的值從數字2 – Avicena00

+0

這就是我最後的注意點,使用'DECODE()'方法。見我的答案更新 – RET

+0

U've非常有幫助,再次感謝 – Avicena00