Проблемы с группировкой этого SQL-запроса - PullRequest
0 голосов
/ 09 ноября 2019

Итак, я пытаюсь найти месяц / год, в котором было наибольшее количество транзакций продажи.

Мой запрос в настоящее время:

SELECT
   DATENAME(M, OrderDate) as orderMonth, 
   year(OrderDate) as orderYear, 
   count(SalesOrderID) as orderCount
FROM
   Sales.SalesOrderHeader soh
GROUP BY OrderDate
HAVING SUM(soh.SalesOrderID) >= ALL (
SELECT SUM(SalesOrderID) FROM Sales.SalesOrderHeader
GROUP BY OrderDate
)

, однако, если я запускаю все вышеИмея строку, чтобы она возвращала все столбцы, а не только самый верхний столбец, она возвращает несколько дубликатов месяцев / лет и orderCounts. например, в июне 2011 года в этом запросе было возвращено около 30 строк, каждая из которых находится в диапазоне от 2 до 11 orderCounts, в общей сложности запрос возвращает 1124 строки, где он должен возвращать только 38, начиная с диапазона продаж с 2011 по 2014 год ив этом диапазоне всего 38 месяцев.

Я почти уверен, что мне нужно указать месячную группу, и я должен изменить свои значения GROUP BY на что-то вроде:

GROUP BY DATENAME(month, soh.OrderDate), DATENAME(YYYY, soh.OrderDate)

, но потом я получаюошибка «Каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой»

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Ваша проблема в том, что вы агрегируете по OrderDate, а не по месяцам и годам. Итак, ваша версия запроса должна выглядеть следующим образом:

SELECT DATENAME(MONTH, OrderDate) as orderMonth, 
       YEAR(OrderDate) as orderYear, 
       COUNT(*) as orderCount
FROM Sales.SalesOrderHeader soh
GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
HAVING COUNT(*) >= ALL (SELECT COUNT(*)
                        FROM Sales.SalesOrderHeader soh2
                        GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
                       );

Однако никто бы не написал такой запрос. Проще и эффективнее использовать TOP и ORDER BY. Эквивалент вашего запроса:

SELECT TOP (1) WITH TIES DATENAME(MONTH, OrderDate) as orderMonth, 
       YEAR(OrderDate) as orderYear, 
       COUNT(*) as orderCount
FROM Sales.SalesOrderHeader soh
GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
ORDER BY orderCount DESC;

Оба они возвращают все месяцы с максимальным значением - если есть дубликаты. Если вы хотите гарантировать только одну строку в наборе результатов, используйте SELECT TOP (1) вместо SELECT TOP (1) WITH TIES.

0 голосов
/ 09 ноября 2019

Не уверен, какой синтаксис sql вы используете, но вы можете просто отсортировать по транзакциям и выбрать самую высокую запись?

SELECT top 1
   DATENAME(M, OrderDate) as orderMonth, 
   year(OrderDate) as orderYear, 
   count(SalesOrderID) as orderCount
FROM
   Sales.SalesOrderHeader soh
Group by orderMonth, orderYear

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