#mysql #sql
#mysql #sql
Вопрос:
Это первый раз, когда я задаю что-то на этом сайте, поэтому, если этот вопрос был задан плохо, я был бы признателен за обратную связь.
Итак, проблема заключается в следующем. В моей таблице, назовем ее «Итоги», у меня есть итоги продаж. Каждая строка содержит полный итог за эту неделю, а также отдельные итоги за каждый день недели. Таким образом, эти пять итогов складываются в итог недели. В каждой строке также есть неделя года (формат: гггг).
так что это выглядело бы, например, так
id|date |total|totalsu|totalmo|totaltu|totalwe|totalth|totalfr|totalsa
-----------------------------------------------------------------------
1|201921| 50.0| 00.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 0.0 |
2|201922| 60.0| 00.0 | 15.0 | 10.0 | 15.0 | 10.0 | 10.0 | 0.0 |
3|201923| 70.0| 30.0 | 5.0 | 10.0 | 10.0 | 10.0 | 5.0 | 0.0 |
4|201924| 50.0| 00.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 0.0 |
Теперь мой вопрос в том, как мне получить все итоги, скажем, со среды на неделе 201921 по вторник на неделе 201924, в рамках одного запроса? Было бы здорово, если бы я мог получить это в рамках одного запроса, но если это абсолютно невозможно, два или три тоже должны быть в порядке.
Ожидаемый результат был бы равен 180, если моя математика верна.
Комментарии:
1. У вас там довольно странная таблица, почему дни разделены на столбцы, а не на строки?
2. Это очень хороший вопрос. Я не знаю. Это очень, очень старая таблица, и я новичок в этой компании. Похоже, нам просто придется это принять.
3. Какими будут критерии запроса, будут ли это две даты или две недели за год (что в вашем столбце даты) и два дня?
4. Верно, я забыл сказать: критериями будут две обычные даты. Я генерирую запрос с помощью языка программирования Delphi, где у меня есть две обычные даты, и мне нужно сделать один (предпочтительно) запрос с этими двумя датами. Но вам не нужно писать для меня код delphi, просто дайте мне пример SQL со среды по вторник 2 недели спустя. Я надеюсь, что это достаточно ясно
Ответ №1:
Способ сделать это, хотя могут быть и более эффективные / чистые, заключается в использовании statments CASE WHEN . Вы можете попробовать что-то вроде этого:
SELECT
sum(
CASE WHEN date < YEARWEEK($startDate, 0) OR date > YEARWEEK($endDate, 0) THEN 0
WHEN date = YEARWEEK($startDate, 0) THEN
CASE WHEN DAYOFWEEK($startDate) = 1 THEN totalsu totalmo totaltu totalwe totalth totalfr totalsa
WHEN DAYOFWEEK($startDate) = 2 THEN totalmo totaltu totalwe totalth totalfr totalsa
WHEN DAYOFWEEK($startDate) = 3 THEN totaltu totalwe totalth totalfr totalsa
WHEN DAYOFWEEK($startDate) = 4 THEN totalwe totalth totalfr totalsa
WHEN DAYOFWEEK($startDate) = 5 THEN totalth totalfr totalsa
WHEN DAYOFWEEK($startDate) = 6 THEN totalfr totalsa
WHEN DAYOFWEEK($startDate) = 7 THEN totalsa
END
WHEN date = YEARWEEK($endDate, 0) THEN
CASE WHEN DAYOFWEEK($endDate) = 7 THEN totalsu totalmo totaltu totalwe totalth totalfr totalsa
WHEN DAYOFWEEK($endDate) = 6 THEN totalsu totalmo totaltu totalwe totalth totalfr
WHEN DAYOFWEEK($endDate) = 5 THEN totalsu totalmo totaltu totalwe totalth
WHEN DAYOFWEEK($endDate) = 4 THEN totalsu totalmo totaltu totalwe
WHEN DAYOFWEEK($endDate) = 3 THEN totalsu totalmo totaltu
WHEN DAYOFWEEK($endDate) = 2 THEN totalsu totalmo
WHEN DAYOFWEEK($endDate) = 1 THEN totalsu
END
WHEN date > YEARWEEK($startDate, 0) OR date < YEARWEEK($endDate, 0) THEN totalsu totalmo totaltu totalwe totalth totalfr totalsa
END
)
FROM
table;
Я не уверен на 100% в синтаксисе, но он должен обеспечить ожидаемый результат или дать вам способ их получения. Я использовал функции YEARWEEK и DAYOFWEEK.
Комментарии:
1. Вместо того, чтобы писать
totalsu totalmo ... totalsa
, не могли бы вы также просто написатьtotal
?