2016-06-25 19 views
0

私はテーブル持っている:0 .. 4と同じ一つのグループと5を持つものである他の文字との最後の文字でNumberを持って複雑なクエリは

Number | Name 
__________________ 

100  | A 
101  | B 
102  | C 
103  | D 
104  | E 
..................  
105  | F 
106  | G 
108  | I 
109  | J 
..................  
110  | K 
111  | L 
114  | O 
.................. 
115  | P 
116  | Q 
...  | ... 

すべての行を... 9別のグループに属しています。そのようなグループはこの表にあります:

Group 100 
    Group 105 
    Group 110 
    Group 115 
    Group ... 

不足しているグループ(メンバーが不足しています)を見つける方法を教えてください。テーブルの場合

(例として示した)上記の結果は次のとおりです。ここで

Group 105 [missing members: 107] 
    Group 110 [missing members: 112,113] 
+0

このような出力はSQLのみで生成しますか? – YakovL

答えて

0

は、あなたがそれを

-- sample data 
; with tbl as 
(
    select Number = 100 union all 
    select Number = 101 union all 
    select Number = 102 union all 
    select Number = 103 union all 
    select Number = 104 union all 
    select Number = 105 union all 
    select Number = 106 union all 
    select Number = 108 union all 
    select Number = 109 union all 
    select Number = 110 union all 
    select Number = 111 
), 
-- number tables (here you only required 0 to 4 as you are grouping by 5) 
num as 
(
    select n = 0 union all 
    select n = 1 union all 
    select n = 2 union all 
    select n = 3 union all 
    select n = 4 
) 
-- the query 
select [Group] = t.Number/5 * 5, misisng = max(stuff(m.missing, 1, 1, '')) 
from tbl t 
    cross apply 
    (
     select ',' + convert(varchar(10), (t.Number/5 * 5) + n) 
     from num 
     where not exists 
      (
       select * 
       from tbl x 
       where x.Number = (t.Number/5 * 5) + n 
      ) 
     order by n 
     for xml path('')    
    ) m (missing) 
where m.missing is not null 
group by t.Number/5 * 5 

を行うことができます方法です - あなたはmssingしたい場合は、このクエリを使用別の行にはありません - クエリ select [Group] = t.Number/5 * 5、m.missing from tbl t クロス適用 ( =(t.Number/5 * 5)+ N ( はTBLから* を選択し、X x.Number =(t.Number/5 * 5)+ N ) )Mが存在しないNUM から m.missingはnullではありません。

+0

それは動作しません! – daiphuniadea

+0

@daiphuniadea、何がうまくいかないのかを詳しく教えてください。 – Squirrel

+0

すみません、うまくいきます。どのように私は別のレコード、2つのレコードの平均グループ110でこの結果を得ることができます。ありがとうございました – daiphuniadea

0

うまくいきます。

Group 105 [missing members: 107] 
Group 110 [missing members: 112,113] 

この結果を別のレコードで取得するには、2レコードの平均グループ110を使用します。 このように:

Group 105 [missing member: 107] 
Group 110 [missing member: 112] 
Group 110 [missing member: 113]