SQL Дата и количество запроса к серверу - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать запрос SQL, основанный на следующей информации.

У меня есть сумма, купленная и проданная за каждый день для статей. Я пытаюсь получить запрос, который показывает:

Общая «сумма» на «статью» за «месяц

« сумма »должна быть разделена на« положительную сумму »и« отрицательную сумму », суммируя все положительные «суммы» и все отрицательные «суммы» отдельно.

Дата имеет формат «гггг-мм-дд 00: 00: 00.000»

Я пробовал следующее

SELECT article, date, SUM (amount) Total FROM shop group by FORMAT(date, 'yyyy_MM'), article

Я получаю следующее сообщение:

"Дата недопустима в списке выбора, потому что она не содержится ни в агрегатной функции, ни в предложении GROUP BY"

Если я выньте дату из запроса, все работает нормально и подсчитывает итоги.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Исходный ответ для MySQL

В вашем запросе в основном две ошибки:

  1. FORMAT - это функция, которая преобразует число в строку. Итак, MySQL сначала преобразует вашу дату в число (что даже не должно быть возможным и вызовет ошибку, но MySQL, тем не менее, преобразует его в какое-то число), а затем имеет смысл формата 'yyyy_MM', возможно, принимая ММ означает Мьянму, я не знаю. Я предполагаю, что вы получаете разные значения для каждого дня вместо одного значения в месяц. Вместо этого вы хотите DATE_FORMAT(date, '%Y-%m').
  2. Вы пытаетесь сгруппировать по месяцам, но затем отображаете дату. Какая дата? В месяце может быть до 31 даты. Вместо этого вы должны отобразить месяц, по которому вы сгруппировали (т.е. снова DATE_FORMAT(date, '%Y-%m')).

Что касается разделения положительных и отрицательных сумм, вы можете использовать условную агрегацию, т.е. CASE WHEN внутри функции агрегирования (SUM).

SELECT
  DATE_FORMAT(date, '%Y-%m') AS month,
  article,
  SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
  SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY DATE_FORMAT(date, '%Y-%m'), article
ORDER BY DATE_FORMAT(date, '%Y-%m'), article;

Обновленный ответ для SQL сервера

In SQL Server FORMAT(date, 'yyyy_MM') - это функция для получения года и месяца свидание. Запрос отсюда:

SELECT
  FORMAT(date, 'yyyy_MM') AS month,
  article,
  SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
  SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY FORMAT(date, 'yyyy_MM'), article
ORDER BY FORMAT(date, 'yyyy_MM'), article;
1 голос
/ 03 августа 2020

Вам нужна так называемая инъективная функция для ваших дат: способ конвертировать все даты в месяце в одно и то же значение, и вам нужно использовать его как в вашем SELECT и предложения GROUP BY. LAST_DAY () - достойная функция для использования. Так же, кстати, и DATE_FORMAT(date, '%Y-%m').

Попробуйте следующее:

   SELECT article, LAST_DAY(date) month_ending, SUM (amount) Total 
     FROM shop
    GROUP BY LAST_DAY(date), article

Там общая запись решений этой проблемы здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...