Member 13410460 Ответов: 2

Как я могу поместить накопительный пакет в новый столбец в SQL ?


Всем привет,

У меня есть этот запрос, который я использую для vb.net формы,
SELECT   SUM(Price)                    AS 'Total'
         ,CONVERT(char(7), date, 120)  AS 'year'
FROM     [dbo].[Expenses]
WHERE    Department = 'Grocery'
GROUP BY CONVERT(char(7), date, 120)  
HAVING   CONVERT(char(7), date, 120) >= '2017-01'  
AND      CONVERT(char(7), date, 120) <= '2020-01' 


И я пытаюсь поместить общую сумму в новый столбец, чтобы использовать ее в своей метке.vb.net но я, кажется, не могу этого сделать.
Как я могу этого достичь?

Благодарно

Что я уже пробовал:

Это тот самый, который я пробовал:

SELECT   SUM(Price)                    AS 'Total'
         ,CONVERT(char(7), date, 120)  AS 'year'
FROM     [dbo].[Expenses]
WHERE    Department = 'Grocery'
GROUP BY CONVERT(char(7), date, 120)  
HAVING   CONVERT(char(7), date, 120) >= '2017-01'  
AND      CONVERT(char(7), date, 120) <= '2020-01' 

2 Ответов

Рейтинг:
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

Member 13410460

Спасибо