2012-02-19 28 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