常规MySQL选择查询到交叉表查询

常规MySQL选择查询到交叉表查询,mysql,Mysql,我已经创建了下面的查询,它可以正常工作,但是需要在一行中包含单个标题的值 SELECT DATE_FORMAT(tblcom.omActCompDate, '%Y-%m') AS febl_Month, IF (SUM(DISTINCT weEstBuildLgth) IS NULL, SUM(DISTINCT tblcom.omEstBuildLgth, SUM(DISTINCT tblcom.omEstBuildLgth) - SUM(DISTINCT weEstBuildLg

我已经创建了下面的查询,它可以正常工作,但是需要在一行中包含单个标题的值

SELECT  DATE_FORMAT(tblcom.omActCompDate, '%Y-%m') AS febl_Month,    

IF (SUM(DISTINCT weEstBuildLgth) IS NULL, SUM(DISTINCT tblcom.omEstBuildLgth, 
SUM(DISTINCT tblcom.omEstBuildLgth) - SUM(DISTINCT weEstBuildLgth)) AS febl_remaining

FROM      tblweeklyebl RIGHT OUTER JOIN tblcom ON tblweeklyebl.comID = tblcom.omID 
WHERE tblcom.omstatusID Like 'Closed'
GROUP BY DATE_FORMAT(tblcom.omActCompDate, '%Y-%m')
这为我提供了以下输出:

febl_Month  febl_remaining
2014-01 42550
2014-02 33200
2014-03 42950
2014-04 30192
2014-05 48216
2014-06 58650
2014-07 41451
2014-08 1775
但我需要这样的结果

Jan   Feb   Mar...
42550 33200 42950...

您需要知道要返回的行数。。所以你可以伪造一个透视表。。但这将给出正确的结果。。。我又加了一句。。选择1作为id。。到原始的SELECT,这样我们就可以从该伪id转为行到列

查询:

结果: 编辑: 要让它充满活力,你应该试试

SELECT 
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%01') THEN febl_remaining END) 'Jan',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%02') THEN febl_remaining END) 'Feb',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%03') THEN febl_remaining END) 'Mar',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%04') THEN febl_remaining END) 'Apr',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%05') THEN febl_remaining END) 'May',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%06') THEN febl_remaining END) 'Jun',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%07') THEN febl_remaining END) 'Jul',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%08') THEN febl_remaining END) 'Aug'
    SUM(febl_remaining) as 'Total febl',
    AVG(febl_remaining) as 'Average febl'

FROM
(   SELECT 
        1 as id, 
        DATE_FORMAT(tblcom.omActCompDate, '%Y-%m') AS febl_Month,    
        IF 
        (   SUM(DISTINCT weEstBuildLgth) IS NULL, 
              SUM(DISTINCT tblcom.omEstBuildLgth), 
              SUM(DISTINCT tblcom.omEstBuildLgth) - SUM(DISTINCT weEstBuildLgth)
        ) AS febl_remaining
    FROM      tblweeklyebl 
    RIGHT OUTER JOIN tblcom ON tblweeklyebl.comID = tblcom.omID 
    WHERE tblcom.omstatusID Like 'Closed'
    GROUP BY DATE_FORMAT(tblcom.omActCompDate, '%Y-%m')
) t 
GROUP BY t.id

为什么不使用编程语言来实现呢?要做到这一点,您需要知道此查询将返回的行数John,非常感谢。。工作得很好。。此处缺少一个结束括号:
SUM(DISTINCT tblcom.omEstBuildLgth)@jlig oh抱歉,我没有正确复制它,已通过编辑修复。。很高兴它对你有用。。随着时间的推移,你将不得不添加更多的行,但这会起作用:)还有一件事。。需要使“2014-01”日期动态化。。试图添加:DATE_格式(tblcom.omActCompDate,%Y-%m')=DATE_格式(NOW(),'%Y-%01')代替DATE,但得到了“tblcom.omActCompDate”未知列?@jlig您试图将其与什么进行比较?您是否试图将
DATE\u格式(tblcom.omActCompDate,'%Y-%m')
DATE\u格式(NOW(),'%Y-%01')
?@jlig我想我理解您的要求。。请参阅我的编辑,了解使用日期\格式的更动态的方式(现在(),“%Y-%01”)
+-------+--------+-------+-------+-------+-------+-------+------+
| Jan   |   Feb  |  Mar  |  Apr  |  May  |  Jun  |  Jul  |  Aug |
+-------+--------+-------+-------+-------+-------+-------+------+
| 42550 |  33200 | 42950 | 30192 | 48216 | 58650 | 41451 | 1775 |
+-------+--------+-------+-------+-------+-------+-------+------+
SELECT 
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%01') THEN febl_remaining END) 'Jan',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%02') THEN febl_remaining END) 'Feb',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%03') THEN febl_remaining END) 'Mar',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%04') THEN febl_remaining END) 'Apr',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%05') THEN febl_remaining END) 'May',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%06') THEN febl_remaining END) 'Jun',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%07') THEN febl_remaining END) 'Jul',
    MAX(CASE febl_month WHEN DATE_FORMAT(NOW(), '%Y-%08') THEN febl_remaining END) 'Aug'
    SUM(febl_remaining) as 'Total febl',
    AVG(febl_remaining) as 'Average febl'

FROM
(   SELECT 
        1 as id, 
        DATE_FORMAT(tblcom.omActCompDate, '%Y-%m') AS febl_Month,    
        IF 
        (   SUM(DISTINCT weEstBuildLgth) IS NULL, 
              SUM(DISTINCT tblcom.omEstBuildLgth), 
              SUM(DISTINCT tblcom.omEstBuildLgth) - SUM(DISTINCT weEstBuildLgth)
        ) AS febl_remaining
    FROM      tblweeklyebl 
    RIGHT OUTER JOIN tblcom ON tblweeklyebl.comID = tblcom.omID 
    WHERE tblcom.omstatusID Like 'Closed'
    GROUP BY DATE_FORMAT(tblcom.omActCompDate, '%Y-%m')
) t 
GROUP BY t.id