1

数千行のテーブルがあります。これから、合計が0の値を含めWTE、列の各値の列の合計を抽出する必要がありbandます。また、各合計を独自の列に含める必要があります。サマリーテーブルを簡単に更新できます。

私が現在持っているコードは、関連する行から値を返します。

SELECT 
   IF(band="E",WTE,0) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14

しかし、SUM()を追加すると、戻り値は正しくありません(ゼロ、数千になるはずです)。

SELECT 
   IF(band="E",SUM(WTE),0) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14

http://en.wikibooks.org/wiki/MySQL/Pivot_tableを見てきましたが、そのアプローチを自分の問題にどのように適用すべきかわかりません。

私は何をすべきか?

4

3 に答える 3

2

この特定のケースでは、使用する方が簡単ではないでしょうWHEREか?

SELECT SUM(WTE) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
AND band = "E"

一般的なケースではGROUP BY、各バンド (列バンドの各値) の結果が必要だと言うので、次のように使用できます。

SELECT band, SUM(WTE) AS `WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
GROUP BY band

これにより NULL または 0 が返されます。代わりに、必要にIFNULL応じて NULL を 0 に変換するために使用できます。

IFNULL(SUM(WTE), 0)

編集:コメントで指摘したように、複数の行ではなく、異なるバンドに対して複数の列が必要です。一般的に言えば、SQL からそれを行うべきではありません (2 番目のクエリを使用し、コードからピボット操作を実行します) が、例外があり、SQL の外部でそれを行うのが非常に複雑な場合があるため、次のように行うことができます。 :

SELECT
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "E") AS `Band6_WTE`,
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "F") AS `Band7_WTE`,
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "G") AS `Band8_WTE`

正確な構文には少し調整が必要かもしれません (一部のデータベースではそれぞれに句SELECTを含める必要があり、一部のデータベースFROMではサブセレクトの各列に名前が必要な場合があります。MySQL ではそうではないと思いますが、今は確認できません)。原則は関係なく適用できるはずです。

于 2012-09-29T13:21:18.810 に答える
2

次の場合は合計する必要があります。

SELECT
    SUM(IF(band="E",WTE,0)) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
于 2012-09-29T13:04:29.020 に答える
1

Noody は、元のクエリで誤った結果が得られる理由を説明しています。

SELECT元のクエリには、句に集計関数があります。これは、これが集計であることを MySQL に伝えます。句がないGROUP BYため、すべての行を 1 つのグループとして扱い、1 つの行を返します。

さて、bandこの場合はどうなるでしょうか?SQL 標準またはその他の SQL の方言では、元のクエリはエラーを返し、次のようなものbandが集約されていないことを示します。

MySQL には Hidden Columns と呼ばれる (誤った) 機能があり、この構文を使用できます。band比較のためにすべての行からランダムな値を取得します。値が「E」の場合、すべての WTE の合計が返されます。または、別の値を持つ可能性があり、その場合は 0 が返されます。

通常、非表示の列は使用しないでください。集計クエリがある場合は、SELECTステートメント内の「裸の」列も句に含める必要があります。GROUP BY

于 2012-09-29T14:39:06.190 に答える