2017-03-03 57 views
0

我有一個表,看起來像如下:創建指望表是引用自身

Table Image

下表列出的國家和地區(州,省,縣等),在這些國家內。我需要計算所有國家內所有地區的數量。正如你所看到的,每個地區都有一個ParentID這是你可以在其中找到該地區的國家的ID。例如,加利福尼亞州位於美國,因此其母公司ID爲1(美國的ID)。

所以,從簡單的表上述結果應該是:

美國:2加拿大:1

我曾嘗試以下:

  1. 全選值轉換成表格,其中ID a 1(對於美國)
  2. 將所有值其中有一個表ID 3(加拿大)
  3. Parent ID爲1
  4. Parent ID爲3
  5. 做兩個表計數選擇所有的值到加拿大表中選擇所有的值到美國表

上述方法的問題是,如果添加新國家,則不會自動生成計數。 任何想法使這更動態?

+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 

where子句確保你只有「頂級」行會顯示出來。

+0

謝謝@Stefano Zanini,但這隻給予頂級行數。我想要頂級+子級別 – DanSm

+1

您的問題指出「我需要產生所有國家內所有地區的計數」,這很有意義,因爲如果這些級別只是國家和地區,那麼地區級計數將始終爲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

我認爲(1,1,'usa')應該是(1,null,'usa')以匹配OP的表格。但是我不能提交這麼小的編輯(少於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