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;
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