我有一个表像下面这样:行合并2008
Customer |Type |Count Joe |Silver-S |1 Joe |Silver |7 Joe |Gold |3 Joe |Gold-S |2
我需要合并这使它看起来像下面这样:
Customer |Type |Count Joe |Silver |8 Joe |Gold |5
帮助!
我有一个表像下面这样:行合并2008
Customer |Type |Count Joe |Silver-S |1 Joe |Silver |7 Joe |Gold |3 Joe |Gold-S |2
我需要合并这使它看起来像下面这样:
Customer |Type |Count Joe |Silver |8 Joe |Gold |5
帮助!
select Customer,
case when Type like 'Silver%' then 'Silver'
when Type like 'Gold%' then 'Gold' end, sum(Count)
from table
group by Customer,
case when Type like 'Silver%' then 'Silver'
when Type like 'Gold%' then 'Gold' end
select Customer, [Type], SUM([Count]) from (
select Customer, replace([Type], '-S', '') [Type], [COUNT] from Customer
)
t
group by customer, [Type]
太棒了 - 完美的工作!谢谢! – AshesToAshes 2012-02-25 20:50:48
试试这个:
select
Customer,
left([Type],CHARINDEX('-', [type])),
sum(COUNT)
from Customers
group by
Customer,
left([Type],CHARINDEX('-', [type]));
或者这样://编辑:这可能是慢
select
Customer,
replace([Type], '-S', ''),
sum(COUNT)
from Customers
group by
Customer,
replace([Type], '-S', '');
如果你的数据库项目 - 你应该重新设计数据库并将该“-S”放在另一个字段中,或避免将来出现这种情况。
我喜欢这个答案最好的,因为它不依赖于特定的子字符串S或主要值金/银。但请将其与您的其他答案结合起来(或删除您的其他答案)。 – 2012-02-19 15:49:05
答案合并。 – Kamil 2012-02-19 16:18:57
我认为在这种情况下使用cte更清洁。我会做这样的事情:
首先,测试数据:
DECLARE @tbl TABLE(Customer VARCHAR(100),[Type] VARCHAR(10),[Count] INT)
INSERT INTO @tbl
VALUES
('Joe','Silver-S',1),
('Joe','Silver',7),
('Joe','Gold',3),
('Joe','Gold-S',2)
的查询:
;WITH CTE AS
(
SELECT
tbl.Customer,
REPLACE(tbl.[Type],'-S','') AS [Type],
tbl.[Count]
FROM
@tbl AS tbl
)
SELECT
CTE.Customer,
CTE.[Type],
SUM(cte.[Count]) AS [Count]
FROM
CTE
GROUP BY
CTE.Customer,
CTE.[Type]
下面是一个使用分区的办法解决:
SELECT DISTINCT Customer, REPLACE([Type], '-S', '') AS [Type],
SUM([Count]) OVER (PARTITION BY (SELECT REPLACE([Type], '-S', ''))) AS [Count]
FROM Customer
黄金和黄金有什么区别?你是否有很多类似的模式,即铜牌,铜牌。你想要的是一个按操作标准的组,但你可能需要一些字符串操作或一个case语句来标准化类型字段 – Sparky 2012-02-19 13:04:44
谢谢,但正如我在下面提到的,Phil的答案是正确的。这个答案意味着对于每种类型的方案都有一个S的模式(例如X和X-S)。 – AshesToAshes 2012-09-29 09:48:48