在引用自己的表上创建计数

时间:2017-03-03 14:42:35

标签: sql sql-server sql-server-2008

我的表格如下所示:

Table Image

该表列出了这些国家/地区内的国家和地区(州,省,县等)。我需要计算所有国家内所有地区的数量。如您所见,每个地区都有ParentID,这是您可以在其中找到该地区的国家/地区ID

例如,加利福尼亚州在美国,因此其父ID为1(美国的ID)。

因此,上面简单表格的结果应为:

美国:2 加拿大:1

我尝试了以下内容:

  1. 在表格中选择所有值ID a 1(对于美国)
  2. 在表格中选择所有值ID a 3(对于加拿大)
  3. 选择所有值到USA表中,Parent ID为1
  4. 选择加拿大表格中的所有值,Parent ID为3
  5. 对两个表都有统计意义
  6. 上述方法存在的问题是,如果添加新国家/地区,则不会自动生成计数。 有关使这更有活力的想法吗?

3 个答案:

答案 0 :(得分: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子句确保您只显示“顶级”行。

答案 1 :(得分: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

答案 2 :(得分: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