SQL - ошибка Informix приводит к другой ошибке - коридор зеркал PITA - PullRequest
2 голосов
/ 04 июня 2011

Я использую Informix версии 11.50.FC6 через iSql


Я даю результат блока 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 голосов
/ 04 июня 2011

Вы не можете использовать свои метки для производных столбцов в вашей группе по списку. При этих обстоятельствах вам нужно перечислить столбцы группировки по их порядковому положению.

Измените ваш 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;

Это не проверено, но, надеюсь, дает вам идею - всегда происходит агрегация, и результат приводится в текст.

1 голос
/ 07 июня 2011

Хотя следующая ссылка представляет собой проблему другого рода, она может пролить свет на решение вашей проблемы с помощью предложения GROUP BY. Ошибка компиляции отчета ACE с несколькими операторами SELECT INTO

0 голосов
/ 09 июня 2011

Я принял все советы, что это невозможно, и переписал его, используя 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;
0 голосов
/ 05 июня 2011

Проблема связана со столбцами 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. Сумма должна рассчитываться только в том случае, если все строки соответствуют условию.

Итак, подведем итог: в настоящее время я только ответил на вопрос о реальной проблеме с вашим запросом. Я буду рад дополнить мой ответ решением после того, как вы уточните мои вопросы.

...