2012-02-02 32 views
3

我有一個包含交易細節的表格,SQL選擇 - 合併行相匹配的ID

我設法要回數據的原始形式,分類交易

我現在需要的條件要做的是每筆交易返回1行。

我現在擁有的是:

TransID | Type 
1  | G 
2  | G 
2  | G 
2  | G 
3  | S 
4  | G 
4  | S 
5  | X 
5  | G 
6  | G 
6  | S 
6  | X 

我需要爲每一筆交易是返回如下:

TransID | Type 
1  | G 
2  | G 
3  | S 
4  | M 
5  | G 
6  | M 

所以,我需要的是,如果交易是單行,然後返回該類型。

如果交易具有多行,評估如下:

All Types = G -> Return G 
All Types = S -> Return S 
Mix of Types G and S -> Return M 
Mix of Types G and X -> Return G 
Mix of Types S and X -> Return S 
Mix of Types S, G and X -> Return M 

回答

4

一個簡單的方法可能是...

SELECT 
    TransID, 
    CASE 
    WHEN G+S+X = 3 THEN 'M' 
    WHEN S+X = 2 THEN 'S' 
    WHEN G+X = 2 THEN 'G' 
    WHEN G+S = 2 THEN 'M' 
    WHEN S  = 1 THEN 'S' 
    WHEN G  = 1 THEN 'G' 
        ELSE '-' 
    END as aggregate_type 
FROM 
(
    SELECT 
    TansID, 
    MAX(CASE WHEN Type = 'G' THEN 1 ELSE 0 END) AS G, 
    MAX(CASE WHEN Type = 'S' THEN 1 ELSE 0 END) AS S, 
    MAX(CASE WHEN Type = 'X' THEN 1 ELSE 0 END) AS X 
    FROM 
    YourTable 
    GROUP BY 
    TransID 
) 
    AS data 

雖然你可能能夠鞏固CASE語句短路,在必要時這應該很容易改變。

+0

我喜歡你的解決方案! – chris 2012-02-02 12:03:41

+0

不錯的方法,就像它 – Tomek 2012-02-02 12:14:17

+0

我喜歡這個解決方案,因爲它將很好地適合存儲過程。 – 2012-02-02 12:14:35

0

在這裏你去:

CREATE FUNCTION dbo.GetFinalType (@g int, @s int, @x int) 
RETURNS CHAR(1) 
AS 
begin 

IF @g>0 AND @s=0 AND @x=0 RETURN 'G' 
IF @g=0 AND @s>0 AND @x=0 RETURN 'S' 
IF @g>0 AND @s>0 AND @x=0 RETURN 'M' 
IF @g>0 AND @s=0 AND @x>0 RETURN 'G' 
IF @g=0 AND @s>0 AND @x>0 RETURN 'S' 
IF @g>0 AND @s>0 AND @x>0 RETURN 'M' 

RETURN '?' 
END 

和查詢:

SELECT 
    TransId, 
    dbo.GetFinalType(
     SUM(CASE WHEN Type='G' THEN 1 ELSE 0 END), 
     SUM(CASE WHEN Type='S' THEN 1 ELSE 0 END), 
     SUM(CASE WHEN Type='X' THEN 1 ELSE 0 END)) FinalType 
FROM 
    Transactions 
GROUP BY 
    TransId