2017-05-07 8 views
1

私は2つの列:shipping_idを発送方法を参照する注文のテーブルと、注文がパックされた日付を保持するpackedを持っています。 日付でグループ分けして値から列を作成する方法は?

+-------------+------------+ 
| shipping_id | packed | 
+-------------+------------+ 
| 1   | 2017-05-07 | 
| 1   | 2017-05-06 | 
| 2   | 2017-05-06 | 
| 2   | 2017-05-06 | 
| 3   | 2017-05-05 | 
+-------------+------------+ 

は私が何とかグループは、日付 packedによって結果は、セルの列と値として入れて出荷タイプがその日パックされ、その配送方法とされてきた注文のカウントする必要があります。このようなもの:

+------------+---+---+---+ 
| date | 1 | 2 | 3 | 
+------------+---+---+---+ 
| 2017-05-05 | 0 | 0 | 1 | 
| 2017-05-06 | 1 | 2 | 0 | 
| 2017-05-07 | 1 | 0 | 0 | 
+------------+---+---+---+ 

これはMySQLで可能ですか?どのようにSQLクエリのようになりますか?

あなたはバニラSQLクエリでそれを行うことはできないでしょう

+1

毎日の異なるshipping_idsの無限の数に制限はありませんか? –

+0

私は動的SQLでmysql条件付き集計が必要だと思っています。 –

+0

@ P.Salmon Shippingsは、IDが参照する別のテーブルに格納されます。もちろん、その数は限定されていません。 –

答えて

1

、あなたはストアドプロシージャを使用する必要があります、ありがとうございました。

動的ピボットについては、MySQL pivot row into dynamic number of columnsをご覧くださいが、実際には使いやすいとは思われません。GROUP_CONCAT()はデフォルトで1024バイトに制限されており、手順を作成して使用する必要があります。


バニラSQLを使用すると、クエリせいぜい1を与えます。

SQL Fiddle

クエリ1

select `shipping_id`, `packed`, count(1) as nb 
from t 
group by `shipping_id`, `packed` 
order by `packed`, `shipping_id` 

Results

| shipping_id |  packed | nb | 
|-------------|------------|----| 
|   3 | 2017-05-05 | 1 | 
|   1 | 2017-05-06 | 1 | 
|   2 | 2017-05-06 | 2 | 
|   1 | 2017-05-07 | 1 | 

クエリ2

SET @sql = NULL 

クエリ3

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'COUNT(IF(shipping_id = ''', 
     shipping_id, 
     ''', 1, NULL)) AS `', 
     shipping_id,'`' 
    ) 
) INTO @sql 
FROM t 

クエリ4

SET @sql = CONCAT('SELECT packed, ', @sql, ' FROM t GROUP BY packed ORDER BY `packed`') 

クエリ5

PREPARE stmt FROM @sql 

は、クエリ6

EXECUTE stmt 

Results

|  packed | 1 | 2 | 3 | 
|------------|---|---|---| 
| 2017-05-05 | 0 | 0 | 1 | 
| 2017-05-06 | 1 | 2 | 0 | 
| 2017-05-07 | 1 | 0 | 0 | 

クエリ7

DEALLOCATE PREPARE stmt 
+0

アグリゲーションを使用しているときは、selectでは '*'を使用しないでください。このクエリは現在動作する可能性がありますが、将来新しい列が追加されると機能しなくなる可能性があります。列名を明示的に記述します。 – GurV

+0

@GurV updated;) – Blag

+0

@GurV BTW、あなたの金の 'SQL'のおめでとう! – Blag

関連する問題