我的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
非常感谢你!
答案 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