2012-02-02 51 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