0

次のようなテーブルがあります。

CREATE TABLE EXAMPLE
(
    ID          BIGINT(20),
    REPORTED_0      INTEGER(11),
    REPORTED_1      INTEGER(11),
    REPORTED_2      INTEGER(11),
    REPORTED_3      INTEGER(11),
    REPORTED_4      INTEGER(11),
    REPORTED_5      INTEGER(11),
    REPORTED_6      INTEGER(11),
    REPORTED_7      INTEGER(11),
    REPORTED_8      INTEGER(11),
    REPORTED_9      INTEGER(11),
    REPORTED_10     INTEGER(11)
 );

IDで合計する必要があります。私はこれをします:

SELECT(ID, SUM)
        a.ID,
        (a.REPORTED_0 + a.REPORTED_2 + a.REPORTED_3 + a.REPORTED_4 +
        a.REPORTED_5 + a.REPORTED_6 + a.REPORTED_7 + a.REPORTED_8 +
        a.REPORTED_9 + a.REPORTED_10)
FROM EXAMPLE a
GROUP BY a.ID;

この合計を行うより効率的な方法はありますか?

申し訳ありませんが、私はSQLに非常に慣れていません。

4

2 に答える 2

2

既存のスキーマを考えると、クエリについて非効率なことは何もありません。列に名前を付けずに 1 つの列を除くすべての列を合計するための構文上のショートカットを探している場合、それは見つかりません。このSUM()関数は、列ではなく行の合計に使用されます。

単一のテーブルから選択しているため、テーブル エイリアスは必要なく、元のクエリで列の 1 つが欠落しています。また、クエリは NULL をうまく処理できません。おそらく、それらを 0 として扱いたいと思うでしょう。これは、あなたが望むように書き直されたクエリです。

SELECT ID,
  (
    COALESCE(REPORTED_0,0) + COALESCE(REPORTED_1,0) + COALESCE(REPORTED_2,0) + 
    COALESCE(REPORTED_3,0) + COALESCE(REPORTED_4,0) + COALESCE(REPORTED_5,0) + 
    COALESCE(REPORTED_6,0) + COALESCE(REPORTED_7,0) + COALESCE(REPORTED_8,0) + 
    COALESCE(REPORTED_9,0) + COALESCE(REPORTED_10,0)
  ) AS REPORTED_TOTAL
FROM EXAMPLE
GROUP BY ID;
于 2012-08-06T18:23:35.330 に答える
0

それが最も効率的な解決策だと思います。テーブル構造が非常に貧弱です。私があなただったら、テーブルの構造を次のようにする必要があります。

Create Table Example
(
    ID              BigInt(20),
    ReportValue     Int(11),
    ReportIndex     Int(5)
)

したがって、これは構造のクエリになります。

SELECT  ID, SUM(ReportValue)
From    Example
GROUP BY    ID

まあ、それは単なる提案です:)

于 2012-08-06T15:43:26.327 に答える