常规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