2016-07-26 7 views
1

列に行を取得するmySQLクエリを作成しようとしていますが、私は最も近い結果を達成しましたが、まだ必要なものではなく、私は何が欠けている。MySQLの行と列を動的に

SET SESSION group_concat_max_len = 1000000; 

SET @sql = NULL; 

SET @rank=0; 

SELECT 
    GROUP_CONCAT(
    CONCAT(
     'MAX(CASE WHEN cpus.hardware_id= ''', 
     cpus.hardware_id, 
     ''' THEN cpus.type END) AS CPU',@rank:[email protected]+1 
      ) 
    )INTO @sql 
FROM 
    hardware 
LEFT JOIN cpus ON hardware.id = cpus.hardware_id; 


SET @sql=CONCAT('SELECT hardware.id, ',@sql,' FROM 
    hardware 
    JOIN cpus ON hardware.id = cpus.hardware_id GROUP BY hardware.id'); 

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

このクエリの結果は次のとおりです。

|id|CPU1          |CPU2         |CPU3        | 
|10|Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz |NULL         |NULL        | 
|11|NULL          |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz| 

そして、私は達成するために必要な結果は次のとおりです。

|id|CPU1          |CPU2         | 
|10|Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz |NULL         | 
|11|Intel(R) Xeon(R) CPU E5530 @ 2.40GHz  |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz | 

クエリは、私は複数のCPUを持つことができるため、動的にする必要がありますハードウェアごとに

SQL Fiddle

この上の任意のヘルプは本当に感謝しています。前もって感謝します。

答えて

0

動的SQLが必要なのかなと思います。 2つの列が必要な場合は、次の操作を実行できます。

select cpus.hardware_id as id, min(cpus.type) as cpu1, 
     (case when min(cpus.type) <> max(cpus.type) then max(cpus.type) end) as cpu2 
from cpus 
group by cpus.hardware_id; 
+1

私はCPUとして多くの行を持つことができるので、動的でなければなりません。このサンプルデータの場合、最大CPUは2ですが、CPUが増えている別のハードウェアがある場合は、それらのすべてを返す必要があります。 – vandyk

0

どのようにピボットクエリの質問が嫌いですか。私は本当にあなたがSQLでこれを解決しようとすると何の利点も得られないと信じています。つまり、SQLは実際に構造化されたデータの言語です。特に、あなただけのIDと複数のCPUのフィールドをしたい場合:

なぜあなたはソフトウェア側で持っているものは何でもコード、私は意味

id | number | CPU 
---+--------+----------------------------- 
1 |  1 | first cpu description 
1 |  2 | second cpu description 
1 | ... | ... 
2 |  1 | ... 

をフェッチしていないこれらのCPU通じますおそらくサイクルとにかく、私は疑います。ソフトウェア側では、IDが同じであれば、CPUを収集するだけです。

また、mysqlでは、cpuフィールドに表示されないセパレータを使用してgroup_concatを追加することも、新しいjson関数の1つを使用することもできます。 (はい、私はそれらのクエリにも頭を悩ましていました。そして、より単純でほとんどいつもより良いです。)