SQL: получение итогов за определенный день при суммировании итогов за неделю

#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 ?