2017-08-01 9 views
0

私は完全にmySQLに慣れており、以下の作業に苦労しています。私はテーブルt1を持っています:MySQL - 1つの列/ 3つの列を3つの列/ 1つの行に再編成しますか?

ITEM SIZE COUNT 
------------------------ 
1001 small 11 
1001 medium 6 
1001 large 34 
1002 small 10 
1002 large 23 
1003 small 81 
1003 medium 12 
1003 large 38 
...etc... 

このデータは何百ものタプルの間続くものです。私は最終的に行う必要があり、このような数再編成です:

ITEM SMALL MEDIUM LARGE 
----------------------------- 
1001 11  6  34 
1002 10  0  23 
1003 81  12  38 

...等...その項目1002は、ミディアムサイズは、最初のテーブルに表示されていない

注意を。したがって、その値は2番目の表では0です。

提案がありますか?ポインタ?私はこのソリューションが次のようなものだと仮定しています:

SELECT item 'ITEM', if(ITEM=1001 and SIZE=???, SIZE) 'SMALL', ...etc... 
FROM t1; 

しかし、それは私の知る限りです。

+0

アプリケーションコード – Strawberry

答えて

2

私の答えは(すべての目的と目的のために)@xQbertと同じですが、 "create table as select"を使用して値を直接新しいテーブルに入れます。私はそのMySQLのキーワードとしてカウント数の周りにバッククォートを使用し、必須ではありませんが、私は習慣的にキーワードのように見える任意のものをバッククォート

CREATE TABLE t2 AS 
    SELECT 
    ITEM, 
    SUM(CASE WHEN SIZE = "small" THEN `COUNT` ELSE 0 END) AS "SMALL", 
    SUM(CASE WHEN SIZE = "medium" THEN `COUNT` ELSE 0 END) AS "MEDIUM", 
    SUM(CASE WHEN SIZE = "large" THEN `COUNT` ELSE 0 END) AS "LARGE" 
    FROM t1 
    GROUP BY ITEM; 

+0

私は予約語であるものをいつもバックチェックしています:Pまたは私はテーブルの名前を変更します。 – xQbert

+0

@Peter Wrightはい!これはうまくいった。ありがとうございます。 – Pete

+0

それを聞いてうれしい@Peteそれは基本的な解決策ですが、予期しない問題を回避する必要があります。 –

2

Rextester例:http://rextester.com/VRVPKM75531

ピボットまたは条件付き集約(mysqlはピボットをサポートしていません)

SELECT item 'ITEM' 
    , coalesce(max(case when size = 'small' then count end),0) as SMALL 
    , coalesce(max(case when size = 'medium' then count end),0) as MEDIUM 
    , coalesce(max(case when size = 'large' then count end),0) as LARGE 
FROM t1 
GROUP BY ITEM 

あなたはアイテムのサイズごとに複数のカウントを持っていて、「SUM」彼らはあなたが行うことができますする必要がある場合それはmaxの代わりに。この場合のMaxは、項目とサイズごとに1レコードを意味します。データを失うことになります。

このようなレコードが存在しない場合は、必要に応じて0を代用することができます。あるいは、coalesceを使用せず、値をNULLにすることもできます。

+0

にデータ表示の問題を扱うことを真剣に考えていますが、それが完全な答えであるかどうかはわかりません。ここに私が持っているものがあります:(残念ながら、私はテーブルとしてテーブルを投稿することはできませんので、ここで言葉の説明です...) 'ITEM'は正しいです。しかし、 'SMALL'、 'MEDIUM'、 'LARGE'の各列はそれぞれ正確に同じ値を持ちます:1/2/0です。これは最初のタプルの正解ですが、下の2番目のタプルは正しくありません。最初のタプルの結果がテーブルの下まで完全にクローンされないように、 'distinct'または 'group by'コマンドなどがありますか?ありがとう – Pete

+0

アイテムごとのグループは、ここでは例を解決する必要があります:しかし、多分私は何かが不足している:http://rextester.com/VRVPKM75531 – xQbert

+0

または多分私はそれをよく説明しませんでした。 :) – Pete

関連する問題