我正在努力寻找解决此MySQL问题的方法。我似乎无法理解该怎么做。我有下表。
Question table
+----+-------------+
| id | question |
+----+-------------+
| 1 | Is it this? |
| 2 | Or this? |
| 3 | Or that? |
+----+-------------+
Results Table
+----+---------+--------+
| id | user_id | job_id |
+----+---------+--------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 3 |
+----+---------+--------+
Answers table
+----+-------------------------+--------------+
| id | answer | fk_question_id | fk_result_id |
+----+-------------------------+--------------+
| 1 | Yes | 1 | 1 |
| 2 | No | 2 | 1 |
| 3 | Maybe | 3 | 1 |
| 4 | Maybe | 1 | 2 |
| 5 | No | 2 | 2 |
| 6 | Maybe | 3 | 2 |
| 7 | Yes | 1 | 3 |
| 8 | Yes | 2 | 3 |
| 9 | No | 3 | 3 |
+----+-------------------------+--------------+
如果可能的话,我想将问题答案显示为每个结果集的列,如下所示。
+-----------+---------+--------+-------------+----------+----------+
| result_id | user_id | job_id | Is it this? | Or this? | Or that? |
+-----------+---------+--------+-------------+----------+----------+
| 1 | 1 | 1 | Yes | No | Maybe |
| 2 | 1 | 3 | Maybe | No | Maybe |
| 3 | 2 | 3 | Yes | Yes | No |
+-----------+---------+--------+-------------+----------+----------+
任何帮助将非常感激。
谢谢
SELECT a.ID,
a.user_ID,
a.job_id,
MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?',
MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?',
MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? '
FROM Results a
INNER JOIN Answers b
ON a.id = b.fk_result_id
INNER JOIN Question c
ON b.fk_question_id = c.ID
GROUP BY a.ID,
a.user_ID,
a.job_id
如果您不清楚问题的数量( 例如Matei Mihai所说的1000个 ),则非常需要动态版本。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN c.question = ''',
question,
''' then b.answer end) AS ',
CONCAT('`',question,'`')
)
) INTO @sql
FROM Question;
SET @sql = CONCAT('SELECT a.ID,
a.user_ID,
a.job_id, ', @sql, '
FROM Results a
INNER JOIN Answers b
ON a.id = b.fk_result_id
INNER JOIN Question c
ON b.fk_question_id = c.ID
GROUP BY a.ID,
a.user_ID,
a.job_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
输出值
╔════╦═════════╦════════╦═════════════╦══════════╦══════════╗
║ ID ║ USER_ID ║ JOB_ID ║ IS IT THIS? ║ OR THIS? ║ OR THAT? ║
╠════╬═════════╬════════╬═════════════╬══════════╬══════════╣
║ 1 ║ 1 ║ 1 ║ Yes ║ No ║ Maybe ║
║ 2 ║ 1 ║ 3 ║ Maybe ║ No ║ Maybe ║
║ 3 ║ 2 ║ 3 ║ Yes ║ Yes ║ No ║
╚════╩═════════╩════════╩═════════════╩══════════╩══════════╝
问题内容: 什么是在php / MySQL中处理数据透视表的最佳方法(或达到这种效果的方法) 我有一个查询,返回的信息如下 我想用PHP建立一个报表,该报表按每周开始的列标题按组进行计数。例如 但是我不确定从哪里开始,因为标题是动态的,具体取决于报表运行的月份。 我知道如何传递月份的详细信息并检索PHP中的所有数据,但是当前它只输出到一列中,而不是能够分组并放入数组中。 任何帮助表示赞赏! 问题答
问题内容: 我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败 到目前为止,在过去的问题帮助下,我得到的是: 参见:http : //sqlfiddle.com/#!2/eab24/1 我确定这很简单,但是我想念什么呢? 谢谢 问题答案: 由于值在其中,因此您要将它们设为列名,因此必须将值包装在反引号中 该SQL将看起来像
问题内容: 我有两个表三元组和标签 三元组表具有以下列 标签表具有以下列 我正在尝试编写sql创建带有动态标题的数据透视表 输出应该是这样的 编写SQL的任何帮助将不胜感激。我在网上看到了示例,但无法弄清楚这一示例 问题答案: 为了 转动 在MySQL中的数据,您需要同时使用聚合函数和表达。 如果您知道已知的列数,则可以对查询进行硬编码: 参见带有演示的SQL Fiddle 但是,如果您的列数未知
这是我从查询中得到的结果 输出 但我想
A 数据透视表介绍 B.1 什么是数据透视表? 数据透视表是一种可以快速汇总、分析大量数据表格的交互式工具。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。使用数据透视表可以深入分析数值数据,以帮助用户发现关键数据,并做出有关企业中关键数据的决策。 数据透视表是针对以下用途特别设计的:以友好的方式,查看大量的数据
问题内容: 我想从Table1转换数据,如您在数据透视表中的第一张图片上所见。在MySQL中可以做到吗?因为数据透视表(A,B,C,D)的值是varchar数据格式,所以我不能使用MySQL的任何聚合函数(例如SUM或其他函数)。 谢谢你的帮助 问题答案: 静态查询(就Bob和Sue而言)可能看起来像这样 现在可以使用动态SQL来解释其他名称 输出: 这是 SQLFiddle 演示 您可以将其包装