Рейтинг:
7
Richard Deeming
Если вы хотите получить общую сумму в виде отдельной строки, используйте GROUP BY ROLLUP
:
SELECT
Sum(Price) As Total,
Year([date]) As [year]
FROM
dbo.Expenses
WHERE
[date] Between '20170101' And '20191231'
And
Department = 'Grocery'
GROUP BY ROLLUP
(Year([date]))
;
GROUP BY (Transact-SQL) - SQL Server | Microsoft Docs[
^]
Пример вывода:
Total | Year
------------
10 | 2017
20 | 2018
30 | 2019
60 | Null
Ряд с
Null
в
Year
это общая сумма.
Редактировать: Чтобы поместить общую сумму в отдельный столбец против каждой строки, используйте:
WITH cte As
(
SELECT
Sum(Price) As Total,
Year([date]) As [year]
FROM
dbo.Expenses
WHERE
[date] Between '20170101' And '20191231'
And
Department = 'Grocery'
GROUP BY
Year([date])
)
SELECT
Total,
[year],
SUM(Total) OVER () As GrandTotal
FROM
cte
;
Member 13410460
Привет Ричард Диминг, Спасибо за ваш ответ и помощь, когда я использую этот код, он дает мне ошибку, которая говорит: "неправильный синтаксис рядом с "годом" " (последний год)
Richard Deeming
Какую версию SQL Server вы используете?
Member 13410460
Я использую SQL Server 2012
Richard Deeming
Возможно, Вам понадобятся дополнительные скобки вокруг элементов группировки для свертки:
GROUP BY ROLLUP (Year([date]))
Member 13410460
Теперь это работает, это дает мне общую сумму, я попробовал немного изменить ее, и она не даст мне всю сумму между месяцами:
ВЫБИРАТЬ
Сумма(Цена) Как Итого,
Преобразовать(char(7), date, 120) в [год]
ОТ
ДБО.Расходы
ГДЕ
Конвертировать(тип char(7), дата, 120) между 2017-01 " и "2019-01'
И
Отдел = 'Продуктовый Магазин'
ГРУППИРОВКА ПО СВЕРТКЕ
( Конвертировать(char(7), дата, 120))
и это дает мне только 2 месяца 2018 года " Клири есть больше, чем 2 месяца в 2018 году"
Richard Deeming
Но есть ли в вашей таблице данные за 2018 год более чем за два месяца? GROUP BY
не "изобретает" значения, которых нет в вашей таблице. :)
Member 13410460
Да, есть , каждый день только одного месяца полон информации.
Member 13410460
Как я могу поместить накопительный пакет в новую строку как "общий итог"?
Richard Deeming
Попробуйте что-нибудь вроде:
WITH cte As
(
SELECT
Sum(Price) As Total,
Year([date]) As [year]
FROM
dbo.Expenses
WHERE
[date] Between '20170101' And '20191231'
And
Department = 'Grocery'
GROUP BY ROLLUP
(Year([date]))
)
SELECT
Total,
IsNull([year], 'Grand Total') As [year]
FROM
cte
;
Member 13410460
Этот код заменяет "NULL" именем "Grand Total", есть ли способ поместить название "Grand Total" рядом с годом с общим значением под ним. Например, новый ряд с общей суммой ?
Richard Deeming
Я не понимаю, о чем ты просишь. Метка "общий итог" появится в отдельной строке рядом со значением общего итога.
Member 13410460
Да, все выглядит именно так, как вы сказали, но могу ли я поместить "общую сумму" в новый ряд? с суммой, конечно.
Richard Deeming
Я все еще не понимаю. "Грант тотал", вместе с суммой, уже стоит в своем ряду. В чем же проблема?
Member 13410460
Вот что - то вроде этого, не поймите меня неправильно, все в порядке, мне просто нужна общая сумма в новый ряд, если это возможно.
Извините, что беспокою вас, вы действительно очень помогли.
|--Итого--| -- год-- | --здесь ("Грант Итого")--|
|--Значения | --значения-- | --с общей суммой здесь--|
Richard Deeming
Это не новый ряд; это новый ряд. колонка.
Попробуйте что-нибудь вроде:
WITH cte As
(
SELECT
Sum(Price) As Total,
Year([date]) As [year]
FROM
dbo.Expenses
WHERE
[date] Between '20170101' And '20191231'
And
Department = 'Grocery'
GROUP BY
Year([date])
)
SELECT
Total,
[year],
SUM(Total) OVER () As GrandTotal
FROM
cte
;
Member 13410460
Спасибо, сэр, и извините за сбивающие с толку сообщения, я отмечу этот ответ как решение, просто было бы хорошо, если бы вы изменили его так, чтобы другим людям было лучше.
Большое спасибо
#realJSOP
Очевидно, то, что мы с вами оба приняли за столбец datetime, скорее всего, не является столбцом datetime.
Member 13410460
Ха-ха, нет, это точно дата-время, я только что проверил его, это нормальный формат даты-времени, Спасибо за ваш ответ.
Рейтинг:
0
#realJSOP
0) вы неправильно используете функцию CONVERT, *и* вы используете ее там, где она не нужна.
1) вы используете ключевые слова SQL для имен столбцов. НЕ ДЕЛАЙ ЭТОГО! Если вы настаиваете на этом, по крайней мере, заключите имена в квадратные скобки.
2) Попробуйте сделать это таким образом.
SELECT Sum(Price) AS Total
,YEAR([date]) AS [year]
FROM [dbo].[Expenses]
WHERE Department = 'Grocery'
GROUP BY YEAR([date])
WHERE [date] BETWEEN '2017-01-01' AND '2019-12-31'
Member 13410460
Hallo realUSOP, Спасибо за ответ, когда я использую этот код, он выдает мне ошибку, которая говорит: "неправильный синтаксис рядом с ключевым словом Where ( второй)".
#realJSOP
ну, я могу только предположить, что ваша колонка даты-это дата-время. поскольку мы не можем разработать вашу схему из тонкого долбаного воздуха, вы находитесь на крючке, чтобы заставить ее действительно работать.
Member 13410460
Да, это DateTime, поэтому я использую CONVERT(char(7), date, 120). Спасибо за ваш ответ.
#realJSOP
Это недопустимо. первым аргументом должно быть выражение - либо имя столбца, либо переменная.
Member 13410460
Конечно, но в данном случае я говорю о коде, который вы написали, и он не работает.
#realJSOP
Это потому, что мы предположили, что "дата" - это название столбца. Этого не должно быть...
Member 13410460
Это дата, и я пробовал с большим D, но все равно ошибка, Я пробовал также дополнительные скобки, но все равно никакого результата.
Member 13410460
Знаете ли вы, как поместить накопительный итог в новую строку с именем "общий итог" ?
#realJSOP
Я бы сделал объединение и просто добавил одну строку для общей суммы
Member 13410460
Как использовать Union для добавления одной строки? Мне очень жаль, что я действительно основы здесь :X
#realJSOP
Вы можете найти его в google