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。

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;

これはテストされていませんが、うまくいけばアイデアが得られます.常に集計が行われ、結果はテキストにキャストされます.

于 2011-06-04T01:46:34.327 に答える
1

次のリンクは別の種類の問題ですが、GROUP BY 句に関する問題の解決に光を当てる可能性があります。複数の SELECT INTO ステートメントを含む ACE レポートのコンパイル エラー

于 2011-06-07T04:30:39.980 に答える
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 に答える
0

問題は、GROUP BY に含まれていない、または集計されていない SELECT リストに表示される列c.progc.grd、にあります。c.stat

一部の列の値に基づいて計算しているようですatt_hrsが、問題は、列の値が一部の行で CASE 式の条件に一致し、他の行では一致しない場合はどうなるかということidです。それは可能ですか?はいの場合、その の値は何になるべきatt_hrsですidか?

期待できる答えは 2 つあります (答えが 2 つしかないふりをしているわけではありません。何かを見落としている可能性があります)。

  1. そのすべての行がCASE 条件に一致しない場合、それ以外の場合は、条件に一致する行の合計になります'ELSED (att)'id

  2. そのための一部(1 つ以上) の行がCASE 条件に一致しない'ELSED (att)'場合は、そうする必要があります。合計は、すべての行が条件に一致する場合にのみ計算する必要があります。id

要約すると、現在、私はあなたのクエリの実際の問題についての質問に答えただけです。あなたが私の質問を詳しく説明した後、解決策で私の答えを拡張させていただきます.

于 2011-06-04T22:51:46.300 に答える