#mysql #sql
#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
большое вам спасибо!
Ответ №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
размером» . Это та же логика, что и получение последнего, просто немного запутанная, чтобы помочь базе данных знать, что делать.
По соображениям производительности полезен индекс on t(repid, id)
.
Ответ №2:
Похоже, вам нужно значение для каждой из дат.
Предполагая, что интересующие вас даты фиксированы, вы можете сделать это следующим образом. Для столбца даты вывода вы проверяете, соответствует ли строка дате для этого столбца. Если это так, вы используете значение 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
Если количество дат является переменным, то на самом деле это не прямой способ сделать это (так как количество результирующих столбцов будет меняться). Было бы проще всего сделать это по-мужски в вашем вызывающем скрипте на основе следующего, предоставляя вам одну строку на повторение / возможную дату с суммой значений 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