2

このクエリによると、何が欠けていますか:

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 句にある必要があります

4

2 に答える 2

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、さまざまな述語で複数を実行するときに使用されます。


アップデート

カウントする述語が複数ある場合、私は次のようにします。

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 ....

GROUPこれにより、同じ方法で処理されている限り、1 つの SQL ステートメントで多くの異なるものを数えるための柔軟性が大幅に向上します。

于 2013-03-29T08:56:12.843 に答える
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 式と集計を書き直す必要があります。

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

11.70 または 12.10 の代わりに IBM Informix 11.50 を使用している場合、集計を行うには、これのバリエーションを使用する必要がある場合があります。

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 では動作します) が、動作する可能性は十分にあります。

于 2013-03-29T09:06:46.360 に答える