MySQL将行透视成动态列数

MySQL将行透视成动态列数,第1张

MySQL将行透视成动态列数

不幸的是,MySQL没有

PIVOT
您基本上想做的功能。因此,您将需要在
CASE
语句中使用聚合函数:

select pt.partner_name,  count(case when pd.product_name = 'Product A' THEN 1 END) ProductA,  count(case when pd.product_name = 'Product B' THEN 1 END) ProductB,  count(case when pd.product_name = 'Product C' THEN 1 END) ProductC,  count(case when pd.product_name = 'Product D' THEN 1 END) ProductD,  count(case when pd.product_name = 'Product E' THEN 1 END) ProductEfrom partners ptleft join sales s  on pt.part_id = s.partner_idleft join products pd  on s.product_id = pd.prod_idgroup by pt.partner_name

参阅SQL演示

由于您不了解产品,因此您可能希望动态执行此 *** 作。这可以使用准备好的语句来完成。

使用动态数据透视表(将行转换为列),您的代码将如下所示:

SET @sql = NULL;SELECt  GROUP_CONCAt(DISTINCT    CONCAt(      'count(case when Product_Name = ''',      Product_Name,      ''' then 1 end) AS ',      replace(Product_Name, ' ', '')    )  ) INTO @sqlfrom products;SET @sql = CONCAt('SELECt pt.partner_name, ', @sql, ' from partners ptleft join sales s  on pt.part_id = s.partner_idleft join products pd  on s.product_id = pd.prod_idgroup by pt.partner_name');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;

请参阅SQL演示

可能值得注意的

GROUP_CONCAT
是,默认情况下限制为1024个字节。您可以通过在整个过程中将其设置得更高一些来解决此问题。
SET@@group_concat_max_len = 32000;



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4897573.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存