2008-11-21 79 views
0

我有一个表有以下的列:SQL分组

 

A B C 
--------- 
1 10 X 
1 11 X 
2 15 X 
3 20 Y 
4 15 Y 
4 20 Y 

欲组基于所述柱B和C的数据,并计数在A列的不同的值。但是,如果有两个或更多的行,其中A列的值是相同的,我想从B列中获取最大值。

如果我做的结果的简单组是:

 

B C Count 
-------------- 
10 X 1 
11 X 1 
15 X 1 
20 Y 2 
15 Y 1 

我想是这样的结果:

 

B C Count 
-------------- 
11 X 1 
15 X 1 
20 Y 2 

是否有可能返回此结果的任何查询。服务器是SQL Server 2005.

+0

请问A和C柱总是一起去?意思是,你能有5-15-X和5-17-Y吗? (在两者之间改变X/Y) – 2008-11-21 11:09:46

回答

2

我喜欢在步骤中工作:首先摆脱重复的A记录,然后组。不是最高效的,但它适用于您的示例。

with t1 as (
    select A, max(B) as B, C 
     from YourTable 
     group by A, C 
) 
select count(A) as CountA, B, C 
    from t1 
    group by B, C 
+0

是的,那是有效的:) 试图难以使用单个查询...并忘记了其他选择。 – Albert 2008-11-21 10:55:32

0

检查了这一点。这应该在Oracle中起作用,尽管我还没有对它进行测试;

select count(a), BB, CC from 
(
select a, max(B) BB, Max(C) CC 
from yourtable 
group by a 
) 
group by BB,CC 
2

其实我已经测试了这一点:

SELECT 
    MAX(B) AS B, 
    C, 
    Count 
FROM 
(
    SELECT 
     B, C, COUNT(DISTINCT A) AS Count 
    FROM 
     t 
    GROUP BY 
    B, C 
) X 
GROUP BY C, Count 

,这让我:

B  C  Count  
---- ---- -------- 
15 X  1   
15 y  1   
20 y  2   
0
WITH cteA AS 
(
    SELECT 
     A, C, 
     MAX(B) OVER(PARTITION BY A, C) [Max] 
    FROM T1 
) 

SELECT 
    [Max] AS B, C, 
    COUNT(DISTINCT A) AS [Count] 
FROM cteA 
GROUP BY C, [Max];