2011-06-04 52 views
2

我通過ISQL SQL - Informix的錯誤導致了另一個錯誤 - 鏡子的走廊PITA


我給一個CASE塊虛擬名稱的結果,使用Informix版本11.50.FC6 att_hrs

SELECT  c.id, 
      CASE WHEN ( c.prog = 'UNDG' 
           AND (c.grd IN (SELECT DISTINCT grd FROM grd_table WHERE att_fctr = 1) OR (c.grd IN ('TR','W','LAB','WC'))) 
           AND c.grd NOT IN ('WM') 
           AND c.stat NOT IN ('X','D')) 
        THEN CAST(SUM(c.hrs) AS CHAR(4)) 
        ELSE 'ELSED (att)' 
      END  att_hrs 
FROM  cw_rec c 
WHERE  c.id IN (SELECT DISTINCT id FROM stu_ids) 
GROUP BY c.id 
INTO TEMP cheese 
WITH NO LOG; 

這給了我一個錯誤:

294: The column (att_hrs) must be in the GROUP BY list. 

試圖修復該錯誤的建議:

SELECT  c.id, 
      CASE WHEN ( c.prog = 'UNDG' 
           AND (c.grd IN (SELECT DISTINCT grd FROM grd_table WHERE att_fctr = 1) OR (c.grd IN ('TR','W','LAB','WC'))) 
           AND c.grd NOT IN ('WM') 
           AND c.stat NOT IN ('X','D')) 
        THEN CAST(SUM(c.hrs) AS CHAR(4)) 
        ELSE 'ELSED (att)' 
      END  att_hrs 
FROM  cw_rec c 
WHERE  c.id IN (SELECT DISTINCT id FROM stu_ids) 
GROUP BY c.id, 
      att_hrs 
INTO TEMP cheese 
WITH NO LOG; 

然後給了我這個錯誤:

217: Column (att_hrs) not found in any table in the query (or SLV is undefined). 

他們那種發現att_hrs很容易當它是不是在GROUP BY黨,但現在突然之間,att_hrs中丟失醬...

你能解決這個問題嗎?

什麼是真正的錯誤& |解決這裏發生的事情以及我需要做什麼來解決它?


編輯
我試圖RET的解決方案,以 GROUP BY 1,2,3...並得到了以下錯誤:

321: Cannot group by aggregate column.

+0

WITH NO日誌中的乳酪就像沒有果凍甜甜圈。 – 2011-06-04 01:12:28

回答

0

我接受了大家的建議,認爲這是不可能的,並使用UNION塊來重寫它。

表&字段名(一個或多個)可能具有不同的,但這裏的想法:

SELECT   s.id, 
       SUM(c.hrs) hrs, 
       'ATT' type 
FROM   expected_contacts s, 
       OUTER stu_crs c 
WHERE   s.id = c.id 
       AND c.prog = 'UNDG' 
       AND c.grd NOT IN ('WM') 
       AND c.stat NOT IN ('X','D') 
       AND (c.grd IN (SELECT DISTINCT grd 
           FROM   grd_table 
           WHERE   att_fctr = 1) 
          OR (c.grd IN ('TR','W','LAB','WC'))) 
       AND c.crs_no <> 'PARM101' 
GROUP BY  s.id 
UNION 
SELECT   s.id, 
       SUM(c.hrs) hrs, 
       'EARN' type 
FROM   expected_contacts s, 
       OUTER stu_crs c 
WHERE   s.id = c.id 
       AND c.prog = 'UNDG' 
       AND (c.grd <= 'DI' or c.grd like 'S%' or c.grd IN ('P','LAB','TR')) 
       AND c.stat NOT IN ('D','W','X') 
GROUP BY  s.id 
UNION 
SELECT   s.id, 
       SUM(c.hrs) hrs, 
       'DEV' type 
FROM   expected_contacts s, 
       OUTER stu_crs c 
WHERE   s.id = c.id 
       AND c.prog = 'UNDG' 
       AND ( c.crs_no LIKE 'ENGL0%' 
         OR c.crs_no LIKE 'MATH0%' 
         OR c.crs_no LIKE 'ENGSL0%' 
         OR c.crs_no LIKE 'ESOL0%') 
       AND c.stat IN ('C','R','W') 
       AND c.grd <> 'IP' 
GROUP BY  s.id 
INTO TEMP  stu_acad 
WITH NO LOG; 
4

您無法通過列表中使用的標籤派生列的小組。在這些情況下,您需要按照序號列出分組列。

更改SQL讀取GROUP BY 1, 2

這裏的relevant entry from the manual。圖269,具體地說。

UPDATE:我沒有仔細檢查CASE語句 - 我不認爲你正在嘗試的是可能的,因爲每行可以不同,不管它是作爲分組還是聚合列處理。

也許你需要嘗試這樣的:

SELECT  c.id, 
      NVL(SUM(CASE 
       WHEN (c.prog = 'UNDG' 
         AND (c.grd IN (SELECT DISTINCT grd FROM grd_table WHERE att_fctr = 1) OR (c.grd IN ('TR','W','LAB','WC'))) 
         AND c.grd NOT IN ('WM') 
         AND c.stat NOT IN ('X','D')) 
       THEN c.hrs 
       ELSE NULL)::CHAR(4) 
       END), 'ELSED (att)') AS att_hrs 
FROM  cw_rec c 
WHERE  c.id IN (SELECT DISTINCT id FROM stu_ids) 
GROUP BY c.id 
INTO TEMP cheese 
WITH NO LOG; 

這是未經測試,但希望給你的想法 - 總是有聚集回事,結果轉換成文字。

+0

感謝您的信息,但這種解決方案帶我到一個新的錯誤:'321:不能通過聚合列分組。'# – CheeseConQueso 2011-06-04 17:47:20

+0

@Cheese:我認爲這是因爲你有'SUM(c.hrs)'在'CASE'內 – 2011-06-04 23:33:20

+0

我必須誠實地說,我昨天沒有仔細查看CASE聲明。這些規則僅在某些情況下才提出聚合。這非常不規範。我相應地更新了我的答案。 – RET 2011-06-05 12:56:09

0

問題在於列號c.prog,c.grd,c.stat,它們出現在SELECT列表中,未包含在GROUP BY中或被聚合。

你似乎基於一些列的值進行計算att_hrs,但問題是:如果什麼列的值一些行匹配CASE表達式的條件,不以某些人相匹配相同id?那可能嗎?如果是,那麼id的值應該是att_hrs

有兩個答案我可以期待(我不是假裝他們是僅有的兩個可能的答案,也許我錯過了什麼):

  1. 它應該是'ELSED (att)'如果所有行因爲id與CASE條件不匹配,否則它應該是匹配條件的行的總和。

  2. 它應該是'ELSED (att)'如果一些(一個或多個)爲id行不匹配CASE條件。只有在所有行匹配條件時才計算總和。

因此,總而言之,目前我只回答了有關您的查詢的實際問題的問題。在您詳細解答我的問題後,我很樂意在答案中提供一個解決方案。

+0

我認爲將prog,grd,stat等分組是一樣的......但那對我並不起作用。關於'其他'的情況,我只讓他們在那裏進行調試 - 他們絕不應該(理論上)也獲得 – CheeseConQueso 2011-06-05 11:01:41

+0

的值,在我遇到的實際問題中有3個案例 - 我只寫了一個演示目的 – CheeseConQueso 2011-06-05 11:02:30

+0

@CheeseConQueso:我認爲這些列並不意味着被分組,但問題在於,您錯誤地引用了它們。如果它們不應該包含在GROUP BY中,那麼*只能在聚合函數*中提及它們。其他案例是什麼樣的?我的意思是,在THEN部分中計算的是什麼?其他SUM或其他東西? – 2011-06-05 11:16:38