发布时间:2025-12-09 13:43:51 浏览次数:4
杨魅力
不幸的是,MySQL没有PIVOT基本上你想要做的功能。因此,您需要使用带有CASE语句的聚合函数:selectpt.partner_name,
count(casewhenpd.product_name=‘ProductA’THEN1END)ProductA,
count(casewhenpd.product_name=‘ProductB’THEN1END)ProductB,
count(casewhenpd.product_name=‘ProductC’THEN1END)ProductC,
count(casewhenpd.product_name=‘ProductD’THEN1END)ProductD,
count(casewhenpd.product_name=‘ProductE’THEN1END)ProductEfrompartnersptleftjoinsaless
onpt.part_id=s.partner_idleftjoinproductspdons.product_id=pd.prod_idgroupbypt.partner_name请参阅SQL Fiddle with Demo由于您不了解产品,因此您可能希望动态执行此操作。这可以使用预先准备的语句来完成。动态数据透视表(将行转换为列)您的代码如下所示:SET@sql=NULL;SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
‘count(casewhenProduct_Name=”’,
Product_Name,
”’then1end)AS‘,
replace(Product_Name,‘‘,”)
)
)INTO@sqlfromproducts;SET@sql=CONCAT(‘SELECTpt.partner_name,‘,@sql,‘frompartnerspt
leftjoinsaless
onpt.part_id=s.partner_id
leftjoinproductspd
ons.product_id=pd.prod_id
groupbypt.partner_name’);PREPAREstmtFROM@sql;EXECUTEstmt;DEALLOCATEPREPAREstmt;请参阅SQL Fiddle with Demo值得注意的GROUP_CONCAT是,默认情况下限制为1024字节。您可以通过在程序持续时间内将其设置得更高来解决此问题,即。SET @@group_concat_max_len = 32000;