2013-09-10 4 views
0

Итак, у меня есть база данных MySQL, которая отслеживает события в календаре. У меня есть таблица с названием календарь, в которой есть все даты, которые меня интересуют. На моей работе у нас есть контракты, которые имеют определенные ценности; для упрощения мы будем использовать только 1 и 2. Эти контракты имеют дату начала и дату окончания. Я хочу взять все контракты на весь календарь и добавить значения контрактов за каждый день.Как суммировать строки после подкачки?

До сих пор у меня есть:

SELECT calendar.datefield AS DATE, contract.time_slots AS Slots_taken 
FROM contract 
RIGHT JOIN calendar ON calendar.datefield 
BETWEEN contract.start_time 
AND contract.end_time 
LIMIT 600 , 30 

Это почти дает мне то, что я хочу. Этот запрос создает таблицы типа:

DATE | Slots_taken 
------------|-------------- 
2013-08-29 |  1 
2013-08-30 |  1 
2013-08-31 |  1 
2013-09-01 |  1 
2013-09-01 |  2 
2013-09-02 |  1 
2013-09-02 |  2 
2013-09-03 |  1 
2013-09-03 |  2 

Но здесь я получаю повторяющиеся даты. Я хочу только одну строку на дату с суммой значений для этой даты. Так оно и должно быть:

DATE | Slots_taken 
------------|-------------- 
2013-08-29 |  1 
2013-08-30 |  1 
2013-08-31 |  1 
2013-09-01 |  3 
2013-09-02 |  3 
2013-09-03 |  3 
+1

LIMIT без ORDER BY (или, возможно, GROUP BY) справедливо бессмысленны. Заметим также, что, хотя поиск термина «LEFT JOIN» на SO возвращает приблизительно 46 237 результатов, «ПРАВОЕ СОЕДИНЕНИЕ» входит в desultore 2,116. Вы можете подумать, что в следующий раз вы структурируете свой запрос, чтобы использовать тот или иной. ;-) – Strawberry

ответ

2
SELECT calendar.datefield AS DATE, SUM(contract.time_slots) AS Slots_taken 
FROM contract 
RIGHT JOIN calendar ON calendar.datefield 
BETWEEN contract.start_time 
AND contract.end_time 
GROUP BY DATE 
LIMIT 600 , 30 
+0

Это то, что я пробовал в первую очередь, но это дает мне весь столбец, суммированный в одну строку. Так было бы: 2013-08-29 | 12 – Acklavidian

+0

Если это то, что вы пробовали первым, и это дало вам одну строку, я подозреваю, что вы пропустили «GROUP BY DATE» из запроса. – GarethD

+0

Это тоже близко, но все умножается на 5. Почему? – Acklavidian

1

, если бы это было ясно, TSQL, я хотел бы предложить SUM() и GROUP BY:

SELECT calendar.datefield AS DATE, sum(contract.time_slots) AS Slots_taken 
FROM contract 
RIGHT JOIN calendar ON calendar.datefield 
BETWEEN contract.start_time 
AND contract.end_time 
LIMIT 600 , 30 
GROUP BY calendar.datefield 

обнажая LIMIT, как это не 'просто' Tsql

надеюсь, что это помогает немного

EDIT

как об этом:

SELECT DATE, SUM(Slots_taken) AS Slots_taken 
FROM (
    SELECT calendar.datefield AS DATE, contract.time_slots AS Slots_taken 
    FROM contract 
    RIGHT JOIN calendar ON calendar.datefield 
    BETWEEN contract.start_time 
    AND contract.end_time 
    LIMIT 600 , 30) A 
GROUP BY calendar.datefield 

Опять же, это скорее 'обычный' TSQL, и это шутка запрос :)

+0

Ладно, это странно, но на самом деле это то, что мне нужно, но все умножается на 5 раз, так что выставляемый старт похож на 'DATE | Slots_taken ------------ | -------------- 2013-08-29 | 5 2013-08-30 | 5 2013-08-31 | 5 2013-09-01 | 15 2013-09-02 | 15 2013-09-03 | 15 ' – Acklavidian

+1

' LIMIT' приходит после 'GROUP BY' – Taryn

1
SELECT calendar.datefield date 
    , SUM(contract.time_slots) slots_taken 
    FROM calendar 
    LEFT 
    JOIN calendar 
    ON calendar.datefield BETWEEN contract.start_time AND contract.end_time 
GROUP 
    BY date 
LIMIT 600 , 30; 
+0

Это также дает мне все мои значения, умноженные на 5 – Acklavidian

Смежные вопросы