省     市
北京市   昌平区
         海淀区
         朝阳区
河北省   保定市
         石家庄市能查询出这样的结果吗,表要怎么设计才好

解决方案 »

  1.   

    可以,case when就做到了
      

  2.   

    可以。
    CREATE TABLE [TB] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [ITEM] [int] NULL ,
    [NOTE] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    CONSTRAINT [PK_TB] PRIMARY KEY  CLUSTERED 
    (
    [ID]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    INSERT INTO TB (ITEM, NOTE) SELECT 3,'XX'
    INSERT INTO TB (ITEM, NOTE) SELECT 3,'XX'
    INSERT INTO TB (ITEM, NOTE) SELECT 4,'XX'
    INSERT INTO TB (ITEM, NOTE) SELECT 5,'XX'
    INSERT INTO TB (ITEM, NOTE) SELECT 5,'XX'
    INSERT INTO TB (ITEM, NOTE) SELECT 6,'XX'SELECT * FROM TB/*-----------------------
    3 XX
    3 XX
    4 XX
    5 XX
    5 XX
    6 XX
    */
    SELECT
        ITEM=CASE WHEN ID=(
                              SELECT MIN(ID)
                              FROM TB
                              WHERE ITEM=A.ITEM
                          )
                   THEN RTRIM(ITEM) ELSE '' END,
        NOTE
    FROM TB AS A
    ORDER BY ID/*
    ITEM         NOTE
    ------------ --------------------
    3            XX
                 XX
    4            XX
    5            XX
                 XX
    6            XX
    SELECT
        ITEM,
        NOTE
    FROM (
        SELECT
            RTRIM(ITEM) AS ITEM,NOTE,ITEM AS order1,0 AS order2
        FROM TB
        UNION ALL
        SELECT '','',ITEM,1
        FROM TB
        GROUP BY ITEM
    ) AS A
    ORDER BY order1,order2
    3 XX
    3 XX4 XX5 XX
    5 XX6 XX
      

  3.   

    省份表:省份id ,省份
    城市区县表:省份id,区县
      

  4.   

    --这样
    ----------------------------------------------------------------
    -- Author  :fredrickhu(我是小F,向高手学习)
    -- Date    :2009-12-02 14:06:13
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([省] varchar(6),[市] varchar(8))
    insert [tb]
    select '北京市','昌平区' union all
    select '北京市','海淀区' union all
    select '北京市','朝阳区' union all
    select '河北省','保定市' union all
    select '河北省','石家庄市'
    --------------开始查询--------------------------
    select
      case id when 1 then 省 else '' end as 省, 市
    from
      (
      select *,id=row_number()over(partition by 省 order by getdate()) from tb
       )t
    ----------------结果----------------------------
    /*省      市
    ------ --------
    北京市    昌平区
           海淀区
           朝阳区
    河北省    保定市
           石家庄市(5 行受影响) 
    */
      

  5.   

    http://www.ahip.cn/tsg/zyly/xzqdm.htm
    GB2260中华人民共和国行政区划代码create table tb(code varchar(6) , name varchar(10)) 
    insert into tb values('110000' ,'北京市')
    insert into tb values('110114' ,'昌平区')
    insert into tb values('110108' ,'海淀区')
    insert into tb values('110105' ,'朝阳区')
    insert into tb values('130000' ,'河北省')
    insert into tb values('130100' ,'石家庄市')
    insert into tb values('130600' ,'保定市')
    goselect m.name , n.name from 
    (select code , name from tb where right(code,4) = '0000') m,
    (select code , name from tb where right(code,4) <> '0000') n
    where left(m.code,2) = left(n.code,2)drop table tb/*
    name       name       
    ---------- ---------- 
    北京市        昌平区
    北京市        海淀区
    北京市        朝阳区
    河北省        石家庄市
    河北省        保定市(所影响的行数为 5 行)
    */
      

  6.   

    create table tb(code varchar(6) , name varchar(10)) 
    insert into tb values('110000' ,'北京市')
    insert into tb values('110114' ,'昌平区')
    insert into tb values('110108' ,'海淀区')
    insert into tb values('110105' ,'朝阳区')
    insert into tb values('130000' ,'河北省')
    insert into tb values('130100' ,'石家庄市')
    insert into tb values('130600' ,'保定市')
    goselect name1 = (case when code2 = (select min(code2) from
    (
    select m.name name1, n.name name2, m.code code1 , n.code code2 from 
    (select code , name from tb where right(code,4) = '0000') m,
    (select code , name from tb where right(code,4) <> '0000') n
    where left(m.code,2) = left(n.code,2)
    ) t2 where t2.code1 = t1.code1) then name1 else '' end)
           , name2
    from
    (
    select m.name name1, n.name name2, m.code code1 , n.code code2 from 
    (select code , name from tb where right(code,4) = '0000') m,
    (select code , name from tb where right(code,4) <> '0000') n
    where left(m.code,2) = left(n.code,2)
    ) t1
    order by t1.code1 , t1.code2drop table tb/*
    name1      name2      
    ---------- ---------- 
    北京市        朝阳区
               海淀区
               昌平区
    河北省        石家庄市
               保定市(所影响的行数为 5 行)
    */
      

  7.   

    借小F的数据用哈if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([省] varchar(6),[市] varchar(8))
    insert [tb]
    select '北京市','昌平区' union all
    select '北京市','海淀区' union all
    select '北京市','朝阳区' union all
    select '河北省','保定市' union all
    select '河北省','石家庄市'
      
    select case when flag=0 then 省 else '' end,市
    from (select *,flag=(select count(1) from TB where 省=t.省 and 市>t.市) from TB T)g
    order by 省,1 desc/*
           市        
    ------ -------- 
    北京市    海淀区
           昌平区
           朝阳区
    河北省    石家庄市
           保定市(所影响的行数为 5 行)*/
    drop table TB
      

  8.   

    虽然前面的能做到,但是和我想得到的结果还是有点偏差!可能我问的不太清楚,在详细的说一下2个表area表
    ID  地域       流量 
    1   北京市      15
    2   上海市      12
    3   石家庄市    8
    4   保定市      10
    5   沈阳市      11
    6   大连市      13
    7   天津市      9父子关系表
    ID   地域   FatherID
    1    北京市    1
    2    上海市    2
    3    天津      3
    4    河北省    4
    5    石家庄市  4
    6    保定市    4
    7    辽宁省    7
    8    沈阳市    7
    9    大连市    7
    想要得到的结果:地域     详细     流量
    北京市            15
    天津市            9
    河北省   保定市   10        
            石家庄市 8
    辽宁省   沈阳市   11
            大连市   13或是这样的也行地域     详细     流量
    北京市   北京市   15
    天津市   天津市   9
    河北省   保定市   10        
    河北省   石家庄市 8
    辽宁省   沈阳市   11
    辽宁省  大连市   13
    第二个表是后来新建的,当时页面没这么显示(不合适的话,可以改动第二个表)
      

  9.   

    area表里是没有省数据的,在新建的表里加的
      

  10.   

    如同这个了?
    参考:/*
    标题:查询指定节点及其所有子节点的函数
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2009-10-20
    地点:陕西西安
    地址:http://topic.csdn.net/u/20091020/18/a667c3dd-07e4-414d-9200-06c35d3d31a9.html
    */
    ID parentid(下级级ID)  名称  数量 
    1  0                名称1  1 
    2  1                名称2  1 
    3  1                名称3  1 
    4  2                名称4  1 
    5  2                名称5  1 
    6  3                名称6  1 
    7  0                名称7  1 
    8  7                名称8  1 
    9  7                名称9  1 合计    6(名称1 以下所有节点 合计数量) 
    名称1  1 
    合计    3(名称2以下有节点) 
    名称2  1 
    名称4  1 
    名称5  1 
    合计    2 
    名称3  1 
    名称6  1 create table tb(ID int,parentid int, name varchar(10) ,cnt int)
    insert into tb values(1 , 0 , '名称1' , 1) 
    insert into tb values(2 , 1 , '名称2' , 1) 
    insert into tb values(3 , 1 , '名称3' , 1) 
    insert into tb values(4 , 2 , '名称4' , 1) 
    insert into tb values(5 , 2 , '名称5' , 1) 
    insert into tb values(6 , 3 , '名称6' , 1) 
    insert into tb values(7 , 0 , '名称7' , 1) 
    insert into tb values(8 , 7 , '名称8' , 1) 
    insert into tb values(9 , 7 , '名称9' , 1)
    go
    --创建临时表
    create table tmp (name varchar(10) ,cnt int)
    go
    --创建查询指定节点及其所有子节点的函数
    create function f_cid(@ID int) returns @t_level table(id int , level int)
    as
    begin
      declare @level int
      set @level = 1
      insert into @t_level select @id , @level
      while @@ROWCOUNT > 0
      begin
        set @level = @level + 1
        insert into @t_level select a.id , @level
        from tb a , @t_Level b
        where a.parentid = b.id and b.level = @level - 1
      end
      return
    end
    go--创建存储过程并将数据插入临时表
    create proc my_proc 
    as
    begin
      declare @id as int
      declare @cnt as int
      declare @name as varchar(10)
      set @id = 0
      while exists(select 1 from tb where id > @id)
      begin
        set @id = (select min(id) from tb where id > @id)
        set @name = (select name from tb where id = @id)
        set @cnt = (select sum(cnt) from (select a.* from tb a , f_cid(@id) b where a.id = b.id ) t)
        insert into tmp select @name , @cnt
      end
    end
    go
    exec my_procselect * from tmpdrop table tb , tmp
    drop function f_cid
    drop proc my_proc/*
    name       cnt         
    ---------- ----------- 
    名称1        6
    名称2        3
    名称3        2
    名称4        1
    名称5        1
    名称6        1
    名称7        3
    名称8        1
    名称9        1(所影响的行数为 9 行)*/
      

  11.   

    SELECT C.地域,B.地域 详细,A.流量  FROM area A,父子关系表 B,父子关系表  C
    WHERE A.ID=B.ID AND B.ID=C.FATHERID