2

我通过 iSql 使用 Informix 版本 11.50.FC6


我给CASE块的结果一个虚拟名称,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.

4

4 回答 4

4

您不能将标签用于分组依据列表中的派生列。在这些情况下,您需要按顺序位置列出分组列。

更改您的 SQL 以读取GROUP BY 1, 2

这是手册中的相关条目。图 269,具体来说。

更新:我没有仔细检查 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;

这是未经测试的,但希望能给你这个想法 - 总是有聚合,结果被转换成文本。

于 2011-06-04T01:46:34.327 回答
1

尽管以下链接是不同类型的问题,但它可能有助于解决您使用 GROUP BY 子句的问题。使用多个 SELECT INTO 语句编译 ACE 报告时出错

于 2011-06-07T04:30:39.980 回答
0

问题在于列c.prog, c.grd, c.stat,它们出现在 SELECT 列表中,既没有包含在 GROUP BY 中,也没有聚合。

您似乎是att_hrs根据某些列的值进行计算的,但问题是:如果列的值在某些行中与 CASE 表达式中的条件匹配,而在其他某些行中不匹配,id怎么办?那可能吗?如果是,那么它的价值应该是att_hrs什么id

我可以期待两个答案(我并不是假装它们是唯一的两个可能的答案,也许我错过了一些东西):

  1. 'ELSED (att)'如果所有id都不匹配 CASE 条件,则应该是,否则它应该是匹配条件的行的总和。

  2. 'ELSED (att)'如果某些(一个或多个)行id与 CASE 条件不匹配,则应该是。只有当所有行都符合条件时,才应计算总和。

因此,总而言之,目前我只回答了有关您查询的实际问题的问题。在您详细说明我的问题后,我很乐意通过解决方案扩展我的答案。

于 2011-06-04T22:51:46.300 回答
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;
于 2011-06-09T02:08:10.703 回答