0

3 つの列を持つテーブルがあります。

LOCATION |   ITEM    |  QUANTITY
--------------------------------
001       RED CAR      1
002       RED CAR      3
003       BLUE CAR     5
002       BLUE CAR     2
001       RED CAR      2
002       RED CAR      5



各場所にある一意のアイテムの数を教えてくれるクエリを実行しようとしています。同じ場所に複数の行があるのは、各場所に複数の人が同時にレコードを入力する可能性があるためです。

目標は、アイテムの総数と各場所が入力した合計を取得することです。

ITEM     | LOCATION 001 | LOCATION 002 | LOCATION 003 |  TOTAL
--------------------------------------------------------------
RED CAR    3              8              0               11
BLUE CAR   0              2              5               7



各場所の合計と各アイテムの合計の両方を取得する単一の SELECT クエリを思い付くことができません。2 つの個別のクエリ リクエストを実行するのではなく、1 つのクエリでこれを完了しようとしています。どんな助けでも大歓迎です。

いくつかの異なるクエリを試すためのテストリンクがあります。
http://www.sqlfiddle.com/#!2/c33cee/1/0

4

2 に答える 2

1

すべての場所が事前にわかっている場合は、次のことができます

SELECT item,
       SUM(CASE WHEN location = 1 THEN quantity ELSE 0 END) location_001,
       SUM(CASE WHEN location = 2 THEN quantity ELSE 0 END) location_002,
       SUM(CASE WHEN location = 3 THEN quantity ELSE 0 END) location_003,
       SUM(quantity) total
  FROM car_uploads
 GROUP BY item

出力:

| | アイテム | LOCATION_001 | LOCATION_002 | LOCATION_003 | 合計 |
----------|--------------|--------------|-------- ------|-------|
| | 青い車 | 0 | 2 | 5 | 7 |
| | 赤い車 | 3 | 8 | 0 | 11 |

これがSQLFiddleのデモです

于 2013-08-24T06:00:23.727 に答える
1

このクエリを試してください:

SELECT ITEM
  ,SUM(CASE WHEN LOCATION = 001 THEN QUANTITY ELSE 0 END) AS Location_001
  ,SUM(CASE WHEN LOCATION = 002 THEN QUANTITY ELSE 0 END) AS Location_002
  ,SUM(CASE WHEN LOCATION = 003 THEN QUANTITY ELSE 0 END) AS Location_003
  ,SUM(Quantity) AS Total
FROM Table1
GROUP BY ITEM;

ロケーションがわからない場合は、次の動的クエリを試すことができます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN `LOCATION` = ''',
      `LOCATION`,
      ''' THEN QUANTITY ELSE 0 END) AS `',
      `LOCATION`, '`'
    )
  ) INTO @sql
FROM Table1;

SET @sql = CONCAT('SELECT ITEM, ', @sql,'
                     ,SUM(Quantity) AS Total 
                     FROM Table1
                    GROUP BY ITEM
                  ');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

結果:

|     ITEM | 1 | 2 | 3 | TOTAL |
|----------|---|---|---|-------|
| BLUE CAR | 0 | 2 | 5 |     7 |
|  RED CAR | 3 | 8 | 0 |    11 |

このSQLFiddleを参照してください

于 2013-08-24T06:06:16.473 に答える