2017-03-03 9 views
0

が、私は以下のように見えるのテーブルを持っていることをテーブルの上にカウントを作成します。私はすべての国のすべての地域の数を生成する必要があります。ご覧のとおり、各地域にはParentIDがあり、地域を見つけることができる国のIDです。は自身を参照

例として、カリフォルニアは米国にあるので、その親のIDは1です(これは米国のIDです)。

ので、簡単なテーブルからの結果は、上記のようになります。

USA:2カナダ:すべて

  1. 選択:私は次のことを試してみました1

    値はID a 1(米国の場合)

  2. を持つテーブルに値をすべて入れますDOは両方のテーブル
にカウント
  • 3として IDが3(カナダ)
  • としてParent IDとUSAテーブルにすべての値を選択しているテーブルはParent IDとカナダのテーブルにすべての値を選択します

    上記の方法の問題点は、新しい国が追加された場合、自動的にカウントが生成されないことです。 これをよりダイナミックにするためのアイデアはありますか?

  • +0

    テーブルにはいくつのレベルのネスティングがありますか? –

    +0

    ちょうど2:国と地域 – DanSm

    答えて

    0

    あなたは自分自身でテーブルを結合する必要があります句のみが「トップレベル」の行が表示されることを保証し

    select t1.ID, t1.segment, count(distinct t2.ID) 
    from yourTable t1 
    join yourTable t2 
    on  t1.ID = t2.parentID 
    where t1.parentID is null 
    group by t1.ID, t1.segment 
    

    ザ・。

    +0

    @Stefano Zaniniに感謝しますが、これはトップレベルの行だけをカウントします。私は最高レベル+下位レベルでカウントしたい – DanSm

    +1

    あなたの質問は、 "すべての国の中のすべての地域のカウントを生成する必要がある"と述べています。なぜなら、レベルが単に国と地域の場合、地域レベルのカウントは常に リージョンレベルの数も表示したい場合は、where句を削除するだけです。 –

    0
    CREATE TABLE CountriesRegions 
    (
        [ID] [int] NOT NULL, 
        parentid [int] NULL, 
        segment [nvarchar](50) NULL) 
    
    insert into CountriesRegions values (1,null,'usa'), (2,1, 'california'), (3, null, 'canada'), (4, 3, 'quebec'), (5, 1, 'NY') 
    
    select a.id, a.segment, count(*) as [Region Count] 
    from CountriesRegions a 
    left join CountriesRegions b 
    on a.id=b.parentid 
    where b.id is not null 
    group by a.id, a.segment 
    
    +0

    OPのテーブルに合わせるには(1,1、 'usa')は(1、null、 'usa')にする必要があります。しかし、私はそのような小さな編集(6文字未満の変更)を提出することはできませんでした。 – Degan

    +0

    @Deganありがとう。私はその変更を行った。 – cloudsafe

    0

    は、おそらくそれはあなたが国と地域の数に加えて、したいクエリの他の種類がある包み、データの意味を再フォーマットします。

    CREATE TABLE #CountriesRegions 
    (
        [ID] [int] NOT NULL, 
        parentid [int] NULL, 
        segment [nvarchar](50) NULL) 
    
    insert into #CountriesRegions values (1,null,'usa'), (2,1, 'california'), (3, null, 'canada'), (4, 3, 'quebec'), (5, 1, 'NY') 
    
    select * from #CountriesRegions 
    
    Create table #Country 
    ([ID] [int] NOT NULL 
    ,[country_name] [nvarchar](50) NOT NULL) 
    
    Insert into #Country select ID, segment AS country_name from #CountriesRegions where parentid IS NULL 
    
    select * from #Country 
    
    Create table #Region 
    ([ID] [int] NOT NULL 
    ,[country_id] [int] NOT NULL 
    ,[region_name] [nvarchar](50) NOT NULL) 
    
    Insert into #Region select ID, parentid AS country_ID, segment AS region_name from #CountriesRegions where parentid IS NOT NULL 
    
    select * from #Region 
    
    Select COUNT(*) As 'Num of Countries' from #Country 
    Select COUNT(*) As 'Num of Regions' from #Region 
    
    関連する問題