3

新人のMYSQLユーザー....値を返し、GROUP_CONCAT関数を使用する単純なMySQLクエリがあります。

SELECT Productid, Name, GROUP_CONCAT(value)
FROM search_export 
Group By Productid, Name;

Productid   Name                     GROUP_CONCAT(value)
666056542   Brand Name           Netgear
1054677552  Ethernet Technology  Gigabit Ethernet
665655662   Form Factor          Wall Mountable,Desktop
56565765    Media Type Supported     Twisted Pair

ただし、クエリを転置して、行ではなく個別の列として「名前」を返すようにする必要があります。これはMySQLでまったく可能ですか?

4

1 に答える 1

10

PIVOT(他のRDBMSとは異なり)MySQLでネイティブにサポートされていない操作を実行する必要があります。

最も近い方法は、次の行に沿ってSQLを作成することです。

SELECT   ProductId,
         GROUP_CONCAT(IF(Name='Brand Name'          ,value,NULL))
           AS `Brand Name`,
         GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
           AS `Ethernet Technology`,
         GROUP_CONCAT(IF(Name='Form Factor'         ,value,NULL))
           AS `Form Factor`,
         GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))
           AS `Media Type Supported`
FROM     search_export
GROUP BY ProductId

可能なName値が動的である場合、次の結果から高水準言語でそのようなSQLを生成できます。

SELECT DISTINCT Name FROM search_export

実際、SQL自体を使用することもできます。

SELECT CONCAT('
         SELECT   ProductId, ',
       GROUP_CONCAT('
                  GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))
                    AS `',REPLACE(Name,'`','``'),'`'
       ), '
         FROM     search_export
         GROUP BY ProductId
       ')
INTO @sql
FROM (
  SELECT DISTINCT Name FROM search_export
) t;

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

異なるName値が多数ある場合はgroup_concat_max_len、デフォルトの1KiBから増やす必要がある場合があることに注意してください。

于 2012-11-27T10:15:49.217 に答える