3

クエリを実行しようとしていますが、実行する方法が見つかりません。

だから私は3つのテーブルを手に入れました

Table Card (card_id)

Table Level(leve_id, leve_desc)

Table CardDetails(cade_id, card_id, leve_id)

だからここに問題があります:各カードは詳細のリストを持っています。

カード自体を除いて、カードごとに、まったく同じ詳細を持つカードの数をカウントするクエリが必要です。これは、の同じリストを意味しleve_idます。

プレーンなt-sqlでそれを実現することは可能ですか?

私は十分に明確になっていることを願っていますが、そうでない場合は、私が必要としていることをよりよく説明しようとします。

編集:

今のところ、どのカードかを知る必要はありませんが、知っていればボーナスポイントがクレジットされます。

編集#2:では、テーブルカード(card_id)1,2,3,4,5,6としましょう

Table level (leve_id, leve_desc)
(1, Level 1), (2,Level 2), (3,Level 3), (4,Level 4), (5, Level5), (6, Level6)

Table CardDetails (card_id, leve_id)
(1, 1), (1, 3), (1, 4), (2, 1), (2, 2), (3, 1)
(3, 3), (3, 4), (4, 5), (5, 1), (5, 2), (5, 3)
(5, 4), (5, 5), (5, 6), (6, 1), (6, 3), (6, 4)

したがって、結果は次のようになります。

Card_id   Nbr_Cards
1    ..   2
2    ..   0
3    ..   2
4    ..   0
5    ..   0
6    ..   2
4

2 に答える 2

4

私があなたを正しく理解しているなら、あなたはこのようなものが欲しいです

SELECT * 
FROM   cards c 
       INNER JOIN carddetails cd 
         ON c.card_id = cd.card_id 
       INNER JOIN (SELECT cade_id, 
                          leve_id 
                   FROM   carddetails 
                   GROUP  BY cade_id, 
                             leve_id 
                   HAVING COUNT (card_id) > 1)dups 
         ON cd.cade_id = dups.cade_id 
            AND cd.leve_id = dups.leve_id 

または、COUNTOVERが好きな場合

with dups as  (
SELECT 
   COUNT(CARD_ID)  OVER (PARTITION BY cade_id, leve_id) cardCount
   cade_id,
   leve_id
FROM  carddetails 
)
    SELECT * 
    FROM   cards c 
           INNER JOIN carddetails cd 
             ON c.card_id = cd.card_id 
           INNER JOIN  dups 
             ON cd.cade_id = dups.cade_id 
                AND cd.leve_id = dups.leve_id 
    WHERE cardCount > 1
于 2012-04-04T21:27:59.933 に答える
4

私があなたの質問を理解したなら。
カードごとに、正確に等しい詳細の数を数えます。

declare @CardDetails table (card_id int, leve_id int)

insert into @CardDetails values
(1, 1),         (1, 3), (1, 4), 
(2, 1), (2, 2), 
(3, 1),         (3, 3), (3, 4), 
(4, 5), 
(5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), 
(6, 1),         (6, 3), (6, 4)


select card_id,
       count(*) over(partition by leve_ids) - 1 as EqualCount
from 
  (
    select card_id,
           (select ','+cast(leve_id as varchar(10))
            from @CardDetails as C2
            where C1.card_id = C2.card_id
            order by C2.leve_id
            for xml path('')) as leve_ids
    from @CardDetails as C1
    group by card_id
  ) T
order by card_id

結果:

card_id     EqualCount
----------- -----------
1           2
2           0
3           2
4           0
5           0
6           2
于 2012-04-04T21:34:32.257 に答える