我正在处理数据透视表查询。架构如下
Sno,名称,地区
同一名称可能在许多地区出现,例如以样本数据为例
1 Mike CA 2 Mike CA 3 Proctor JB 4 Luke MN 5 Luke MN 6 Mike CA 7 Mike LP 8 Proctor MN 9 Proctor JB 10 Proctor MN 11 Luke MN
如您所见,我有一组4个不同的地区(CA,JB,MN,LP)。现在,我想通过将名称映射到区域来获取为其生成的数据透视表
Name CA JB MN LP Mike 3 0 0 1 Proctor 0 2 2 0 Luke 0 0 3 0
我为此写了以下查询
select name,sum(if(District="CA",1,0)) as "CA",sum(if(District="JB",1,0)) as "JB",sum(if(District="MN",1,0)) as "MN",sum(if(District="LP",1,0)) as "LP" from district_details group by name
但是,地区可能会增加,在这种情况下,我将不得不再次手动编辑查询并向其中添加新的地区。
我想知道是否存在一个查询,该查询可以动态获取不同地区的名称并运行上述查询。 我知道我可以通过一个过程来完成该任务并即时生成脚本,还有其他方法吗?
我之所以这么问是因为查询“ select from district_details选择distinct(districts) ”的输出将返回我在每一行上具有地区名称的一列,我希望将其转置为该列。
您根本无法使静态SQL语句返回可变数量的列。每次不同地区的数量更改时,您都需要构建这样的语句。为此,您首先执行
SELECT DISTINCT District FROM district_details;
这将为您提供有详细信息的地区列表。然后,您构建一个遍历先前结果的SQL语句(伪代码)
statement = "SELECT name " For each row returned in d = SELECT DISTINCT District FROM district_details statement = statement & ", SUM(IF(District=""" & d.District & """,1 ,0)) AS """ & d.District & """" statement = statement & " FROM district_details GROUP BY name;"
并执行该查询。然后,您需要在代码中处理可变数量的列