透视MySQL表:我可以对组进行分组并避免一行结果吗?

时间:2017-04-18 18:00:34

标签: mysql sql pivot-table

我无法在MySQL中转动表格。我一直在努力想要达到我想要的结果,我几乎就在那里,但我看不清楚下一步该做什么,我希望你能帮助我。

我正在创建一份调查问卷报告。报告指出应用问题的人,解决问题的人以及给出答案的问题集和更多信息。

我已经有一个查询,可以通过这种方式为每个人提供正确的信息:

╔═══════════════╦══════╦══════════════╦═══════════╦════════════╦════════════════╗
║  supervisor   ║ zone ║   promoter   ║  visit_id ║  question  ║     answer     ║
╠═══════════════╬══════╬══════════════╬═══════════╬════════════╬════════════════╣
║ EDGAR MONTIEL ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║ Question A ║ 1              ║
║ EDGAR MONTIEL ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║ Question B ║ 1              ║
║ EDGAR MONTIEL ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║ Question C ║ Any given text ║
╚═══════════════╩══════╩══════════════╩═══════════╩════════════╩════════════════╝

在许多教程中使用GROUP_CONCATCONCAT,我设法转动报告,检索正确的信息。 简而言之,我这样做了:

SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT('MAX(IF(infoBase.question = \'',question,'\', \'',answer,'\', 0)) AS \'',question,'\'',''), "\n"
    ) INTO @answers
FROM (many tables)
WHERE (some expresions)

然后我使用预准备语句来获得最终结果:

SET @query := 
    CONCAT(
        'SELECT  
         infoBase.supervisor, 
         infoBase.zone, 
         infoBase.promoter,
         infoBase.visit_id,
    ',@answers,' FROM (same tables as before) WHERE (same expresions as before)'
    );

然后我执行查询:

PREPARE statement FROM @query;
EXECUTE statement;

虽然我正确检索了信息,但我的结果集如下所示:

╔═══════════════╦══════╦══════════════╦═══════════╦════════════╦════════════╦════════════════╦════════════╦════════════╦══════════════════════════════════════════════════════════════════════╦════════════╦════════════╦════════════════════════════╗
║  supervisor   ║ zone ║   promoter   ║  visit_id ║ Question A ║ Question B ║   Question C   ║ Question A ║ Question B ║                              Question C                              ║ Question A ║ Question B ║         Question C         ║
╠═══════════════╬══════╬══════════════╬═══════════╬════════════╬════════════╬════════════════╬════════════╬════════════╬══════════════════════════════════════════════════════════════════════╬════════════╬════════════╬════════════════════════════╣
║ EDGAR MONTIEL ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║          1 ║          1 ║ Any given text ║          3 ║          3 ║ Including punctuation characters, like comma, admiration ! or dots . ║          2 ║          2 ║ Text is fun, text is life! ║
╚═══════════════╩══════╩══════════════╩═══════════╩════════════╩════════════╩════════════════╩════════════╩════════════╩══════════════════════════════════════════════════════════════════════╩════════════╩════════════╩════════════════════════════╝

信息是正确的,但它在同一行,并且没有看到关于人的第一部分。所以我尝试按visit_id进行分组,这样可以实现这一点,我得到了这个:

╔═════════════════╦══════╦══════════════╦═══════════╦════════════╦════════════╦════════════════╗
║   supervisor    ║ zone ║   promoter   ║  visit_id ║ Question A ║ Question B ║   Question C   ║
╠═════════════════╬══════╬══════════════╬═══════════╬════════════╬════════════╬════════════════╣
║ EDGAR MONTIEL   ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║          1 ║          1 ║ Any given text ║
║ NEYRA OLIVER    ║ VDM2 ║ OMAR SOTO    ║    114442 ║          1 ║          1 ║ Any given text ║
║ KAYRA RODRIGUEZ ║ GU1  ║ VICTOR SOTO  ║    114197 ║          1 ║          1 ║ Any given text ║
╚═════════════════╩══════╩══════════════╩═══════════╩════════════╩════════════╩════════════════╝

现在表格的第一部分是正确的,但关于问题的第二部分只反映了每一行中第一个人的结果。为了成功,我需要得到以下内容:

╔═════════════════╦══════╦══════════════╦═══════════╦════════════╦════════════╦══════════════════════════════════════════════════════════════════════╗
║   supervisor    ║ zone ║   promoter   ║  visit_id ║ Question A ║ Question B ║                              Question C                              ║
╠═════════════════╬══════╬══════════════╬═══════════╬════════════╬════════════╬══════════════════════════════════════════════════════════════════════╣
║ EDGAR MONTIEL   ║ VM1  ║ MIGUEL LOPEZ ║    104285 ║          1 ║          1 ║ Any given text                                                       ║
║ NEYRA OLIVER    ║ VDM2 ║ OMAR SOTO    ║    114442 ║          3 ║          3 ║ Including punctuation characters, like comma, admiration ! or dots . ║
║ KAYRA RODRIGUEZ ║ GU1  ║ VICTOR SOTO  ║    114197 ║          2 ║          2 ║ Text is fun, text is life!                                           ║
╚═════════════════╩══════╩══════════════╩═══════════╩════════════╩════════════╩══════════════════════════════════════════════════════════════════════╝

这是对实际问题的过度简化。整个问题涉及不同问卷的数十个问题。问卷1有45个问题,问卷2有30个问题,问题3有80个问题等等。所以我甚至不知道问题的确切数量,因此我试图动态地得到这个问题。

我怎样才能得到这个结果? 我需要group by或我需要做什么?

我试图说明清楚。如果需要更多信息,我将编辑问题。致谢!!!

0 个答案:

没有答案