"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Explication détaillée des compétences de conversion dynamique de la ligne dynamique MySQL

Explication détaillée des compétences de conversion dynamique de la ligne dynamique MySQL

Publié le 2025-05-02
Parcourir:863

How to Dynamically Pivot MySQL Rows into Columns?

Mysql Dynamic Row to Colonne Operation

]

question:

Récupérez les données à partir de plusieurs tables et les formatez comme une table de pivot pour les titres de colonnes dynamiques, même si le nombre exact de colonnes n'est pas connu à l'avance.

requête originale:

SELECT partners.name, products.name, COUNT(*) 
FROM sales
JOIN products ON sales.products_id = products.id
JOIN partners ON sales.partners_id = partners.id
GROUP BY sales.partners_id, sales.products_id
LIMIT 0, 30

Solution à l'aide de l'instruction de cas:

]

mysql n'a pas de fonction pivot, il est donc nécessaire d'utiliser une fonction agrégée avec une instruction de cas:

select pt.partner_name,
  count(case when pd.product_name = 'Product A' THEN 1 END) as ProductA,
  count(case when pd.product_name = 'Product B' THEN 1 END) as ProductB,
  count(case when pd.product_name = 'Product C' THEN 1 END) as ProductC,
  count(case when pd.product_name = 'Product D' THEN 1 END) as ProductD,
  count(case when pd.product_name = 'Product E' THEN 1 END) as ProductE
from partners pt
left join sales s
  on pt.part_id = s.partner_id
left join products pd
  on s.product_id = pd.prod_id
group by pt.partner_name

Tableau de pivot dynamique à l'aide d'instructions de prétraitement:

]

Pour gérer les en-têtes de colonne dynamique, une instruction de prétraitement peut être utilisée:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'count(case when Product_Name = ''',
      Product_Name,
      ''' then 1 end) AS ',
      replace(Product_Name, ' ', '')
    )
  ) INTO @sql
from products;

SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' from partners pt
left join sales s
  on pt.part_id = s.partner_id
left join products pd
  on s.product_id = pd.prod_id
group by pt.partner_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3