Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Transpozycja zapytania MySQL - potrzebujesz wierszy do kolumn

Musisz wykonać PIVOT operacja, która nie jest obsługiwana natywnie w MySQL (w przeciwieństwie do niektórych innych RDBMS).

Najbliższe, co możesz uzyskać, to skonstruowanie SQL w następujący sposób:

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

Jeśli to możliwe Nazwa wartości są dynamiczne, możesz wygenerować taki SQL w języku wyższego poziomu z wyników:

SELECT DISTINCT Name FROM search_export

Rzeczywiście, można nawet użyć samego 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;

Zwróć uwagę, że jeśli istnieje wiele różnych Nazwa wartości, może być konieczne zwiększenie group_concat_max_len od domyślnego 1KiB.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unikalne ograniczenie, które sprawdza dwie kolumny w MySQL

  2. Jak przetestować połączenie z bazą danych MySQL za pomocą skryptu?

  3. Jak dodać klauzulę WHERE w instrukcji MySQL Insert?

  4. WordPress przygotował oświadczenie z warunkiem IN()

  5. mysql:Nie możemy utworzyć wyzwalaczy na tabelach systemowych?