我有下表:
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)。 我需要获取总余额,即,NY,PR,ST组的总和(对于每种产品),AL,OH相同,以及CH和DE的余额。
我已经尝试过诸如GROUP BY
,UNION
之类的东西,但都远未达到令人满意的结果
有问题的数据库服务器是MS SQLSERVER。
解决方案可以是任何形式,例如存储过程或SQL查询
编辑:从问题中删除了错误的商店名称(在使用A1,A2,A3之前,所有使用LEFT的解决方案都很好。)对此错误我感到非常抱歉...
使用LEFT的解决方案不适用于更正的名称。
对于这种混乱,我感到非常抱歉-我试图使事情简单化,因此我将这里的商店命名为A,B,C,D ...我对LEFT功能以及什么一无所知混乱会导致...再次抱歉...
答案 0 :(得分:5)
您需要按代码,名称和左边(商店,1)分组,然后对余额进行总计:
select
code, name, left(store, 1) store, sum(balance) [Total Balance By Stores]
from tablename
group by code, name, left(store, 1)
答案 1 :(得分:4)
首先,您必须构造包含您所描述的信息的列-通过采用第一个字母:
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 :(得分:2)
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)
答案 3 :(得分:0)
这是您编辑的问题的答案。
正如我在评论中提到的那样,您设计数据库的方式是确定的(并非几乎是确定的),这将在将来发生变化时(例如新商店或新国家/地区的新商店)引起将来的问题。
无论如何,当前状态的解决方案是:
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