0

我有下表 Tble :

姓名 | 等级
--------------
n1 | L1
n1 | L2
n2 | L1
n2 | L3
n3 | L1
n4 | L3

我怎样才能编写一个 SQL 查询来输出这样的结果?

姓名 | 水平 | CountOfDifferentLevelsForName
------------------------------------------
n1 | L1 | 2
n1 | L2 | 2
n2 | L1 | 2
n2 | L3 | 2
n3 | L1 | 1
n4 | L3 | 1

即例如n1有两个级别L1和L2

我试着做: SELECT Name, count(*) FROM Tble GROUP BY Name

但是只要我也想查看级别...它会弄乱计数,或者不显示所有行

谢谢

4

3 回答 3

2

...并且不使用相关的子查询:

SELECT tb1.Name, tb1.Level, count(*) c
FROM Tble tb1
JOIN Tble tb2 ON tb1.Name = tb2.Name
GROUP BY tb1.Name, tb1.Level

确保连接 ( ) 中使用的列Name已编入索引。

于 2013-03-15T01:15:44.427 回答
1

尝试这个...

select name,lvl,count(*) over (partition by name) as tot_cnt from table;
于 2013-03-15T05:10:27.383 回答
0

有许多可能的方法来达到旅游所需的结果。其中之一是加入一个子查询,该子查询分别获取每个 Name 的记录数,然后将子查询的结果重新加入表本身。

SELECT  a.name, a.Level,
        b.TotalCount
FROM    TableName a
        INNER JOIN 
        (
            SELECT  Name, Count(*) TotalCount
            FROM    TableName
            GROUp   BY Name
        ) b ON a.Name = b.Name

为了获得更快的性能,您应该定义一个INDEXon 列Name

输出

╔══════╦═══════╦════════════╗
║ NAME ║ LEVEL ║ TOTALCOUNT ║
╠══════╬═══════╬════════════╣
║ n1   ║ L1    ║          2 ║
║ n1   ║ L2    ║          2 ║
║ n2   ║ L1    ║          2 ║
║ n2   ║ L3    ║          2 ║
║ n3   ║ L1    ║          1 ║
║ n4   ║ L3    ║          1 ║
╚══════╩═══════╩════════════╝

更新 1

具有 1 级的名称,该级别是 L1(即 n3)

询问:

SELECT  Name
FROM    TableName
GROUP   BY Name
HAVING  COUNT(*) = 1 AND
        MAX(Level) = 'L1'

名称有 2 个级别,这些级别是 L1 和 L3(即 n2)

询问:

SELECT  Name
FROM    TableName
GROUP   BY Name
HAVING  COUNT(*) = 2 AND
        SUM(CASE WHEN Level IN ('L1', 'L3') THEN 1 ELSE 0 END) = COUNT(*) 
于 2013-03-15T01:12:38.430 回答