Как получить суммы столбца таблицы для разных групп данных? - PullRequest
1 голос
/ 09 апреля 2019

У меня есть следующая таблица:

Code |  Name     | Store    |  Balance 
------------------------------------- 
56   | product1  |   NY     |   10
56   | product1  |   CH     |   100
56   | product1  |   DE     |   1000
56   | product1  |   AL     |   10000
56   | product1  |   PR     |   10
56   | product1  |   ST     |   10
56   | product1  |   OH     |   10000

57   | product2  |   NY     |   10
57   | product2  |   CH     |   100
57   | product2  |   DE     |   1000
57   | product2  |   AL     |   10000
57   | product2  |   PR     |   10
57   | product2  |   ST     |   10
57   | product2  |   OH     |   10000

58   | product3  |   NY     |   10
58   | product3  |   CH     |   100
58   | product3  |   DE     |   1000
58   | product3  |   AL     |   10000
58   | product3  |   PR     |   10
58   | product3  |   ST     |   10
58   | product3  |   OH     |   10000

Что мне нужно получить:

Code |  Name     | Store       |  Total Balance By Stores
-----------------------------------------------------
56   | product1  |   NY,PR,ST  |   30
56   | product1  |   CH        |   100
56   | product1  |   DE        |   1000
56   | product1  |   AL,OH     |   20000

57   | product2  |   NY,PR,ST  |   30
57   | product2  |   CH        |   100
57   | product2  |   DE        |   1000
57   | product2  |   AL,OH     |   20000

58   | product3  |   NY,PR,ST  |   30
58   | product3  |   CH        |   100
58   | product3  |   DE        |   1000
58   | product3  |   AL,OH     |   20000

По словам - это 7 магазинов, из которых 3 в одной стране (NY, PR, ST), 2 в другой стране (AL, OH) и 2 в других отдельных странах (CH и DE). Что мне нужно, так это получить общий баланс, т. Е. SUM для группы NY, PR, ST (для каждого отдельного продукта), то же самое для AL, OH, а также баланс для CH и DE.

Я уже пробовал такие вещи, как GROUP BY, UNION и т. Д., Но все это далеко от удовлетворительного результата

Сервер базы данных, о котором идет речь, - MS SQLSERVER.

Решением может быть что угодно, например, хранимая процедура или SQL-запрос

РЕДАКТИРОВАТЬ: УДАЛЕН неправильные названия магазина из вопроса (раньше это были A1, A2, A3, поэтому все решения с LEFT были в порядке.) Я очень сожалею об этой ошибке ...

Решение с LEFT не будет работать с исправленными именами.

Я очень сожалею об этой путанице - я пытался упростить ситуацию, поэтому я назвал магазины здесь как A, B, C, D ... Я понятия не имел о функции LEFT и что путаница это вызовет ... Так что извините еще раз ...

Ответы [ 4 ]

5 голосов
/ 09 апреля 2019

Вам нужно сгруппировать по коду, имени и левому краю (store, 1) и сумме по остатку:

select
  code, name, left(store, 1) store, sum(balance) [Total Balance By Stores]
from tablename
group by code, name, left(store, 1)
4 голосов
/ 09 апреля 2019

Во-первых, вы должны построить столбец, содержащий информацию, которую вы описываете, - набрав первую букву:

select left(store,1) as Store from yourtable

Теперь вы можете включить этот столбец в ваш GROUP BY:

select Code,Name,left(store,1) as Store,sum(Balance ) as [Total Balance By Stores]
from yourtable
group by Code,Name,left(store,1)
2 голосов
/ 09 апреля 2019
CREATE TABLE #sum
    ([Code] int, [Name] varchar(8), [Store] varchar(2), [Balance] int)
;

INSERT INTO #sum
    ([Code], [Name], [Store], [Balance])
VALUES
    (56, 'product1', 'A1', 10),
    (56, 'product1', 'B', 100),
    (56, 'product1', 'C', 1000),
    (56, 'product1', 'D1', 10000),
    (56, 'product1', 'A2', 10),
    (56, 'product1', 'A3', 10),
    (56, 'product1', 'D2', 10000),
    (57, 'product2', 'A1', 10),
    (57, 'product2', 'B', 100),
    (57, 'product2', 'C', 1000),
    (57, 'product2', 'D1', 10000),
    (57, 'product2', 'A2', 10),
    (57, 'product2', 'A3', 10),
    (57, 'product2', 'D2', 10000),
    (58, 'product3', 'A1', 10),
    (58, 'product3', 'B', 100),
    (58, 'product3', 'C', 1000),
    (58, 'product3', 'D1', 10000),
    (58, 'product3', 'A2', 10),
    (58, 'product3', 'A3', 10),
    (58, 'product3', 'D2', 10000)
;
select Code,Name,LEFT(store,1)store ,SUM(balance) from #sum
group by Code,Name,LEFT(store,1)
0 голосов
/ 09 апреля 2019

Это ответ на ваш отредактированный вопрос .
Как я уже упоминал в комментарии, то, как вы проектировали свою базу данных, определенно (не почти) определенно, что вызовет будущие проблемы, когда будут изменения, такие как новые магазины или новые магазины в новых странах.
В любом случае, решение текущего состояния таково:

select
  t.code Code, 
  t.name Name, 
  t.storegroup Store, 
  sum(t.balance) [Total Balance By Stores]
from (
  select *,
    case 
      when store in ('NY', 'PR', 'ST') then 'NY,PR,ST'
      when store in ('AL', 'OH') then 'AL,OH'
      else store
    end storegroup
  from tablename
) t
group by t.code, t.name, t.storegroup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...