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

MySQL数据透视/交叉表查询

岳玉书
2023-03-14
问题内容

问题1: 我有一个具有以下结构和数据的表:

app_id  transaction_id  mobile_no   node_id  customer_attribute  entered_value 
100     111             9999999999  1        Q1                  2                             
100     111             9999999999  2        Q2                  1                             
100     111             9999999999  3        Q3                  4                             
100     111             9999999999  4        Q4                  3                             
100     111             9999999999  5        Q5                  2                             
100     222             8888888888  4        Q4                  1                             
100     222             8888888888  3        Q3                  2                             
100     222             8888888888  2        Q2                  1                             
100     222             8888888888  1        Q1                  3                             
100     222             8888888888  5        Q5                  4

我想以以下格式显示这些记录:

app_id  |  transaction_id  | mobile     |  Q1  |  Q2  |  Q3  |  Q4 |  Q5  |
 100    |      111         | 9999999999 |   2  |   1  |   4  |  3  |  2   |
 100    |      222         | 8888888888 |   3  |   1  |   2  |  1  |  4   |

我知道我需要使用交叉表/数据透视查询来获得此显示。为此,我基于对它的有限知识对其进行了尝试。以下是我的查询:

SELECT app_id, transaction_id, mobile_no,
  (CASE node_id WHEN 1 THEN entered_value ELSE '' END) AS user_input1,
  (CASE node_id WHEN 2 THEN entered_value ELSE '' END) AS user_input2,
  (CASE node_id WHEN 3 THEN entered_value ELSE '' END) AS user_input3,
  (CASE node_id WHEN 4 THEN entered_value ELSE '' END) AS user_input4,
  (CASE node_id WHEN 5 THEN entered_value ELSE '' END) AS user_input5
FROM trn_user_log 
GROUP BY app_id, transaction_id, mobile_no, node_id

根据此查询,我得到以下显示:

app_id  transaction_id  mobile_no   user_input1  user_input2  user_input3  user_input4  user_input5  
100     111             9999999999  2                                                                
100     111             9999999999               1                                                   
100     111             9999999999                            4                                      
100     111             9999999999                                         3                         
100     111             9999999999                                                      2            
100     222             8888888888  3                                                                
100     222             8888888888               1                                                   
100     222             8888888888                            2                                      
100     222             8888888888                                         1                         
100     222             8888888888                                                      4

任何人都可以帮助我对查询进行适当的更改以获取单行而不是如上所述的多行记录。

问题2:
还有一种方法可以获取特定字段的值作为列的名称。正如你可以在上面看到我有user_input1user_input2,…作为标题。取而代之的是,我想将值customer_attribute作为列的标题。

为此,我检查NAME_CONST(name,value)如下:

SELECT app_id, transaction_id, mobile_no,
NAME_CONST(customer_attribute, (CASE node_id WHEN 1 THEN entered_value ELSE '' END))
FROM trn_user_log

但它给出了一个错误

Error Code : 1210 Incorrect arguments to NAME_CONST

需要帮助。


问题答案:

虽然@John的静态答案很好用,但是如果您要转换的列数未知,我会考虑使用准备好的语句来获取结果:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'GROUP_CONCAT((CASE node_id when ',
      node_id,
      ' then entered_value else NULL END)) AS user_input',
      node_id
    )
  ) INTO @sql
FROM trn_user_log;


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

参见带有演示的SQL Fiddle

至于您的第二个,请说清楚您要做什么。



 类似资料:
  • 问题内容: 我正在使用MySQL。这是我的桌子 我需要一个选择查询来显示类似这样的表。 问题答案: 您可以使用此查询- 它产生您想要的结果。但是,如果您想动态地进行操作,请参阅这篇文章“自动执行数据透视表查询”-http: //www.artfulsoftware.com/infotree/queries.php#523,或者该链接- 动态数据透视表。

  • 问题内容: 我正在使用SQL Server 2008,并且希望将数据转换为: 资料集: 所需结果: 目前,我正在执行以下操作,然后将所需的列粘贴到Excel中: 但是,并非所有匹配的行都不能仅仅并排击打表。对于没有Result的列,我希望显示NULL来填充行以使它们都具有相同数量的记录。 我查了一下PIVOT,但我认为这在这里不起作用…这种数据转换称为什么类型?我不认为这是交叉表… 谢谢! 问题答

  • 问题内容: 我的MySQL数据库具有以下列标题: 我有兴趣根据typeOfWork和月份显示结果。例如,所有typeOfWork条目将显示在左侧的第一列中,并且每个字段将在每一列的指定月份总计该特定typeOfWork。因此,我的SQL数据透视表语句当前为: 我目前遇到语法错误,指定了最后一行(从’DEC到ROLLUP’)。我感到困惑的原因是,我只是从脚本中的另一个工作枢轴表改编了该表。我认为差异

  • 问题内容: 我有这个表视图 如何创建将在Oracle 10g中提供此透视图视图的查询? 有没有办法动态地做到这一点?我看到了很多方法(解码,PL / SQL循环,联合,11g数据透视) 但根据上述示例,我尚未找到适合我的方法 编辑 :我不知道在开发时间产品的数量或类型,所以这必须是动态的 问题答案: Oracle 11g是第一个支持PIVOT / UNPIVOT的,因此您必须使用: 您可以使用DE

  • 问题内容: 我在使用该函数在PostgreSQL中创建数据透视表时遇到问题。它运作良好,但可以产生多个记录。如何避免这种情况? 这是SQL: //编辑 Thx to Erwin现在可以使用了,但是我试图在没有内置函数的情况下做到这一点,但是没有运气。有人可以提出建议吗?我的代码只有两年了: 问题答案: 您需要相应地进行第一个查询。我在这里使用简化的语法 。 该函数未包含在标准PostgreSQL中

  • 问题内容: 什么是在php / MySQL中处理数据透视表的最佳方法(或达到这种效果的方法) 我有一个查询,返回的信息如下 我想用PHP建立一个报表,该报表按每周开始的列标题按组进行计数。例如 但是我不确定从哪里开始,因为标题是动态的,具体取决于报表运行的月份。 我知道如何传递月份的详细信息并检索PHP中的所有数据,但是当前它只输出到一列中,而不是能够分组并放入数组中。 任何帮助表示赞赏! 问题答