【问题标题】:Cross Tab Query in MySQLMySQL 中的跨表查询
【发布时间】:2015-03-04 05:20:10
【问题描述】:

我创建了一个 sql 选择查询,但我无法正确显示记录。

表:

gradeid | usrname | reviewmonth | program | total_score | pae
--------------------------------------------------------------
151     | smithj  |      2      | math    | 100%        | 100%
152     | smithj  |      2      | math    |  95%        | 100%
153     | smithj  |      3      | math    |  80%        | 100%
154     | jonesm  |      3      | math    |  79%        | 79% 
155     | jonesj  |      2      | art     |  100%       | 100%

我为显示信息而创建的查询是

SELECT reviewmonth, 
ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2) AS January
FROM vwscore 
WHERE program = 'Math' AND reviewmonth = 1 
UNION ALL
SELECT reviewmonth, 
ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2) AS February
FROM vwscore 
WHERE program = 'Math' AND reviewmonth = 2 
UNION ALL
SELECT reviewmonth, 
ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2) AS March
FROM vwscore 
WHERE program = 'Math' AND reviewmonth =  3
UNION ALL

查询返回:不幸的是我需要水平显示记录。

reviewmonth | January 
----------------------
      1     |  91.94
      2     |  94.86
      3     |  89.89 

期望的结果:

January | February | March
--------------------------
   91.94|   94.86  |  89.89

我尝试了不同的查询来显示答案。我尝试使用 CASE,但它似乎只显示 1 条记录。感谢你的帮助!

【问题讨论】:

  • SELECT COUNT(CASE WHEN reviewmonth = 1 THEN ROUND(AVG( IF(pae = 79, (IF(pae
  • 我收到此错误:[Err] 1111 - 无效使用组功能。谢谢您的帮助。我是不是错过了什么。我按照提供的链接中的 sql 进行操作。

标签: mysql sql pivot-table crosstab


【解决方案1】:

此查询满足您问题的横向需求。

我不关心你想做什么。

请确定这是否适合您。

SELECT 
CASE WHEN  program = 'Math' AND reviewmonth = 1 THEN
        ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2) 
        ELSE 'NULL' END AS January,
CASE WHEN program= 'Math' AND reviewmonth = 2 THEN
        ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2) 
    ELSE 'NULL' END AS February,

CASE WHEN program= 'Math' AND reviewmonth = 3 THEN
        ROUND(AVG( IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score)),2)
    ELSE 'NULL' END AS March
FROM vwscore
WHERE program='Math'

编辑:我并不担心你的期望。现在你会得到我希望的正确结果。

SELECT
ROUND(t.January/t.JanuaryCount,2) AS January,
ROUND(t.February/t.FebruaryCount,2) AS February,
ROUND(t.March/t.MarchCount,2) AS March
FROM 
(
    SELECT
            SUM(CASE WHEN reviewmonth=1 THEN IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score) ELSE 0 END) AS January,
            SUM(CASE WHEN reviewmonth=1 THEN 1 ELSE 0 END) AS JanuaryCount,

            SUM(CASE WHEN reviewmonth=2 THEN IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score) ELSE 0 END) AS February,
            SUM(CASE WHEN reviewmonth=2 THEN 1 ELSE 0 END) AS FebruaryCount,

            SUM(CASE WHEN reviewmonth=3 THEN IF(pae = 79, (IF(pae < total_score, pae,total_score)),total_score) ELSE 0 END) AS March,
            SUM(CASE WHEN reviewmonth=3 THEN 1 ELSE 0 END) AS MarchCount

    FROM 
    vwscore
    WHERE program='Math'
) AS t

【讨论】:

  • 感谢您的帮助。查询就像您所说的那样工作。我觉得我的桌子有问题。返回记录集返回:1月 |空值 ;二月 | 92.19;三月 |空值。有趣的是,它在二月份对所有内容进行了分组。再次感谢...我很困惑。
  • 不客气,罗!很高兴听到它对你有用。 :) 祝你有美好的一天!
  • 看起来好像一切都到了二月。我知道这个查询是有道理的。其余为空
  • 嗨,罗伯!现在检查已编辑的查询。请确保您做对了!
  • Md. Afafat Al Mahmud 的最新回答奏效了!我对您如何得出答案印象深刻。非常感谢!!!再次感谢大家的帮助!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多