2012-02-19 61 views
3

我有一个表像下面这样:行合并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 

帮助!

+3

黄金和黄金有什么区别?你是否有很多类似的模式,即铜牌,铜牌。你想要的是一个按操作标准的组,但你可能需要一些字符串操作或一个case语句来标准化类型字段 – Sparky 2012-02-19 13:04:44

+0

谢谢,但正如我在下面提到的,Phil的答案是正确的。这个答案意味着对于每种类型的方案都有一个S的模式(例如X和X-S)。 – AshesToAshes 2012-09-29 09:48:48

回答

0
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 
3
select Customer, [Type], SUM([Count]) from (
    select Customer, replace([Type], '-S', '') [Type], [COUNT] from Customer 
) 
t 
group by customer, [Type] 
+0

太棒了 - 完美的工作!谢谢! – AshesToAshes 2012-02-25 20:50:48

1

试试这个:

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”放在另一个字段中,或避免将来出现这种情况。

+0

我喜欢这个答案最好的,因为它不依赖于特定的子字符串S或主要值金/银。但请将其与您的其他答案结合起来(或删除您的其他答案)。 – 2012-02-19 15:49:05

+0

答案合并。 – Kamil 2012-02-19 16:18:57

0

我认为在这种情况下使用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] 
2

下面是一个使用分区的办法解决:

SELECT DISTINCT Customer, REPLACE([Type], '-S', '') AS [Type], 
SUM([Count]) OVER (PARTITION BY (SELECT REPLACE([Type], '-S', ''))) AS [Count] 
FROM Customer