当前位置: 首页 > 面试题库 >

mysql查询将行数据动态转换为列

姜彬郁
2023-03-14
问题内容

我正在处理数据透视表查询。架构如下

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

并执行该查询。然后,您需要在代码中处理可变数量的列



 类似资料:
  • 问题内容: MySQL是否可以将列转换为行,从而动态添加行所需的列数。我认为我的问题可能与数据透视表有关,但是我不确定,除了给出以下示例之外,我不知道如何构造此问题。 给定两个表A和B,它们看起来像 表A 我想编写一个如下查询: 结果表 基本上,我想将表B中的每一行变成结果表中的一列。如果有一个新条目被添加到表B中,id = 1,那么我希望结果表自动扩展一列以容纳这个额外的数据点。 问题答案: 您

  • 问题内容: 我在这里跟随一个问题,使用Mysql查询将行动态转换为列。这工作正常,但我需要根据两列进行转换, 上面链接中提到的查询适用于单列“数据”,但我想适用于“数据”和“价格”两列。 我在这里加了一个例子, 给定一个表A,看起来像 我想编写一个如下查询: 我试图创建两个不同的查询,然后创建一个联接来实现此目的,但这可能不是一个好的解决方案。谁能建议像上面链接中提到的解决方案。 谢谢 问题答案:

  • 问题内容: 关于我之前的问题ElasticSearchQuery,其中给出了映射和doc示例,我想将此MySql查询转换为Elasticsearch。这是mysql查询 期待您的帮助 问题答案: 以下查询将为您提供帮助。请注意,在映射中,您已经提到了上述查询。 尽管如此,我还是利用了它,使其与映射保持一致。 我使用过术语查询,术语查询和多匹配查询的变体。 请注意,我已经在字段上使用了Term Qu

  • 问题内容: 我正在使用mysql功能XOR(^)和BIT_COUNT()的Ruby应用程序上工作。但是,我现在需要在运行PyGreSQL的Heroku上运行该应用程序。 我找不到任何可以帮助我的PyGreSQL文档。 那么任何人都可以翻译此mysql查询,以便在pygresql数据库上执行时可以正常工作吗? pygresql给我错误 谢谢。 问题答案:

  • 问题内容: 我需要将此查询从MySQL格式转换为SQLite。我正在尝试自己,但发现了一些困难。 在SQLite中,curdate()和interval函数不存在。 问题答案: 这是基本语法: 我忽略了该子句,因为这些日期是过去1000多个日期,因此他们无论如何都不会选择任何内容。

  • 我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,