MySql:我如何获得横向联盟的结果?

时间:2017-03-14 18:15:16

标签: mysql

我希望将结果生成到水平联合中。我能够组合在一起并生成结果。但是,我需要以预期的结果格式显示结果。

SQL

(SELECT 
    kpa_id AS 'KPA', SUM(weightage) AS 'Total'
FROM
    pmm_question_details
WHERE
    weightage NOT LIKE '%-%'
GROUP BY kpa_id) UNION (SELECT 
    kpa_id AS 'KPA', SUM(weightage_value) AS 'Acheived'
FROM
    pmm_answer_details
WHERE
    application_id = 2
        AND archive_value = 'No'
GROUP BY kpa_id)

实际结果

1   14
2   37
3   19
4   40
5   51
6   24
1   12
2   19
3   0
6   2

预期结果

1   14  1 12
2   37  2 19
3   19  3 0
4   40  6 2
5   51
6   24

1 个答案:

答案 0 :(得分:2)

如果我们可以假设pmm_question_Details总是会有比pmm_answer_details更多或更多的记录......那么两个子查询和一个左连接应该通过用户变量rownum(RN)上的连接来完成这个技巧

SELECT A.KPA, A.Total, B.KPA, B.Acheived
FROM (SELECT kpa_id AS 'KPA'
           , SUM(weightage) AS 'Total'
           , @RN1 := @RN1 + 1 as RN
      FROM pmm_question_details
      CROSS JOIN (SELECT @RN1 :=0) r1
      WHERE weightage NOT LIKE '%-%'
      ORDER BY KPA
      GROUP BY kpa_id) A

LEFT JOIN (SELECT kpa_id AS 'KPA'
                , SUM(weightage_value) AS 'Acheived'
                , @RN1 := @RN2 + 1 as RN
           FROM pmm_answer_details
           CROSS JOIN (SELECT @RN2 :=0) r2
           WHERE application_id = 2
             AND archive_value = 'No'
           ORDER BY KPA
           GROUP BY kpa_id) B
 on A.RN = B.RN
ORDER BY A.KPA

虽然我必须承认,如果你可以在第一时间加入KPA_ID,我不明白为什么需要rownumber ...

如果这可能是预期的结果......(并再次假设pmm_question具有可能在pmm_answer中的所有ID ...)

Expected Results

1   14  1 12
2   37  2 19
3   19  3 0
4   40
5   51
6   24  6 2

然后查询就是......

SELECT A.KPA, A.Total, B.KPA, B.Acheived
FROM (SELECT kpa_id AS 'KPA', SUM(weightage) AS 'Total'
      FROM pmm_question_details
      WHERE weightage NOT LIKE '%-%'
      GROUP BY kpa_id) A
LEFT JOIN (SELECT kpa_id AS 'KPA', SUM(weightage_value) AS 'Acheived'
           FROM pmm_answer_details
           WHERE application_id = 2
             AND archive_value = 'No'
           GROUP BY kpa_id) B
 on A.KPA = B.KPA