Mysql单列结果为多列结果

时间:2014-06-20 10:40:55

标签: mysql sql

我的MySQL查询有问题,问题是我有下表:

id, rep, val dates 

1 rep1 200 06/01/2014 
2 rep2 300 06/01/2014 
3 rep3 400 06/01/2014 
4 rep4 500 06/01/2014 
5 rep5 100 06/01/2014 
6 rep1 200 02/06/2014 
7 rep2 300 02/06/2014 
8 rep3 900 02/06/2014 
9 rep4 700 02/06/2014 
10 rep5 600 02/06/2014 

我希望得到这样的结果:

rep 01/06/2014 02/06/2014 
rep1 200 200 
rep2 300 300 
rep3 400 900 
rep4 500 700 
rep5 100 600 
非常感谢你!

2 个答案:

答案 0 :(得分:1)

您似乎想要每个代表的最新行。这是一种经常表现良好的方法:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.repid = t.repid and
                        t2.id > t.id
                 );

这会将问题转换为:“获取表t中的行,其中没有其他行具有相同的repid和更大的id。”这与获取最后一个逻辑的逻辑相同,只是让人费解,以帮助数据库知道该怎么做。

出于性能原因,t(repid, id)上的索引很有帮助。

答案 1 :(得分:0)

您似乎想要每个日期的val。

假设您感兴趣的日期已修复,那么您可以按照以下方式执行此操作。对于输出日期列,您检查该行是否与该列的日期匹配。如果是这样,你使用 val 的值,如果不是,你只需使用0.然后你将所有结果值相加,按rep分组。我假设了一种固定的日期格式。

SELECT rep, SUM(IF(dates='2014/06/01'), val, 0) AS '2014/06/01', SUM(IF(dates='2014/06/02'), val, 0) AS '2014/06/02'
FROM sometable
GROUP BY rep

或者,如果你只想要每天最高的价值

SELECT rep, MAX(IF(dates='2014/06/01'), val, 0) AS '2014/06/01', MAX(IF(dates='2014/06/02'), val, 0) AS '2014/06/02'
FROM sometable
GROUP BY rep

如果日期的数量是可变的,那么实际上并不是直接的方法(因为结果列的数量会有所不同)。根据以下内容在您的调用脚本中执行此manly最简单,每个rep /可能日期为您提供一行,并为该rep / date组合提供val值的总和: -

SELECT rep, sub0.dates, SUM(IF(sometable.dates=sub0.dates), val, 0)
FROM sometable
CROSS JOIN 
(
    SELECT DISTINCT dates 
    FROM sometable
) sub0
GROUP BY rep, sub0.dates