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 には 2 つのレベル 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

ツアーの望ましい結果を達成するには、多くの方法があります。そのうちの 1 つは、各 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 columnを定義する必要があります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 に答える