SQL Добавить строку общей суммы для каждого свойства - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь создать новую строку общей суммы для каждого состояния.

Пример таблицы:

| State | Item | Amount
    A      X      100
    B      Y      200
    A      Z      100
    B      X      150

Результат:

| State | Item | Amount
    A      X      100
    A      Z      100
 Total A          200
    B      Y      200
    B      X      150
 Total B          350

Есть ли SQL запрос, который я могу использовать для выполнения этой таблицы

Ответы [ 6 ]

2 голосов
/ 16 апреля 2020

Попробуйте запрос ниже.

SELECT * FROM states_YourtableName
    UNION
    SELECT 'Total '+[state] State ,'' Item ,SUM(Amount) Amount
    FROM states_YourtableName GROUP BY [State]

Вы получите вывод, как показано ниже

state   Item    Amount
A        X      100
A        Z      100
B        X      150
B        Y      200
Total A         200
Total B         350
1 голос
/ 16 апреля 2020

Самый простой способ будет UNION ALL. Если вместо «Всего » достаточно показать состояние, оно становится:

select state, item, amount from mytable
union all
select state, null, sum(amount) from mytable group by state
order by state, case when item is null then 2 else 1 end, item;

Результат:

State | Item | Amount
------+------+-------
    A |    X |    100
    A |    Z |    100
    A |      |    200
    B |    Y |    200
    B |    X |    150
    B |      |    350
1 голос
/ 16 апреля 2020

На SQL сервере вы можете использовать ROLLUP в предложении GROUP BY для получения промежуточных и общих сумм по сгруппированным по полям. В вашем случае вы бы группировали по состоянию и элементу, чтобы получить все строки:

SELECT CASE WHEN State IS NULL THEN 'Grand Total'
            WHEN Item IS NULL THEN CONCAT('Total ', State)
            ELSE State
       END AS State,
       Item, 
       SUM(Amount) AS Amount
FROM data
GROUP BY ROLLUP(State, Item)

Вывод:

State           Item    Amount
A               X       100
A               Z       100
Total A         (null)  200
B               X       150
B               Y       200
Total B         (null)  350
Grand Total     (null)  550

Демонстрация по SQLFiddle

0 голосов
/ 16 апреля 2020

Я рекомендую grouping sets. Это обеспечивает намного больше контроля, чем rollup:

select state, coalesce(item, 'Total') as item,
       sum(amount) as amount
from t
group by grouping sets ( (state, item), (state) );
0 голосов
/ 16 апреля 2020

Группировать можно с помощью Rollup

Попробуйте это -

declare @Data table
([State] varchar(20), Item varchar(20), Amount int )

Insert into @Data
values
(    'A',      'X',      100),
(    'B',      'Y',      200),
(    'A',      'Z',      100),
(    'B',      'X',      150)

Select [State], Item, Sum(Amount) Amount
From @Data
Group by [State], Item with Rollup
0 голосов
/ 16 апреля 2020

SQL не работает как файл Excel, он в основном используется для хранения и обработки данных. Если вы хотите сохранить эти данные (итоги) в SQL, на мой взгляд, лучший способ сделать это - создать еще одну таблицу, в которой вы можете хранить свои итоги.

Если вы попытаетесь просто напечатать итоги на вашем экране вы можете проверить ссылку https://www.w3schools.com/sql/sql_count_avg_sum.asp

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