有一个新闻数据表,表里的某一条新闻数据它可能属于多个类别(比如它又是国际新闻(01)又是财经新闻(02))在数据库类别字段里会用分号隔开01;02 
现在需要统计表里面有多少个类别每个类别有多少条数据 该如何做

解决方案 »

  1.   

    先拆分.然后再统计,拆分后的结果做为子查询,如下:
    /*
    标题:分拆列值
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-20
    地点:广东深圳
    描述有表tb, 如下:
    id          value
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    欲按id,分拆value列, 分拆后结果如下:
    id          value
    ----------- --------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc
    */--1. 旧的解决方法(sql server 2000)
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
    FROM tb A, # B
    WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005) 
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    go
    SELECT A.id, B.value
    FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
    )BDROP TABLE tb/*
    id          value
    ----------- ------------------------------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc(5 行受影响)
    */
      

  2.   

    sum(case when  then    else  end ) 
      

  3.   

    说清楚一下嘛
    新闻数据表
    NewsId Category
    1      01,02 
    2      01,03,04
      

  4.   

    --sql 2000
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    goSELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b select id , count(*) cnt from
    (
      SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','
    ) t
    group by idDROP TABLE #
    drop table tb--sql 2005
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    goselect id , count(*) cnt from
    (
      SELECT A.id, B.value
      FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
      )A
      OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
      )B
    ) t
    group by iddrop table tb
      

  5.   

    我在4楼把两种方法都给你了,你把字段名字换一下就行了.
    另如果你能确保没个串中数据不重复,可以用如下简单的方法.select id , cnt = len(Category) - len(replace(Category,',','')) from tb
      

  6.   

    dawugui 非常感谢你回答   我的意思可能是我没说清楚   是这样我不是要统计某条数据有几个类别 我是想统计数据表里面有多少中类别 每个类别有几条数据
    比如 你建的表里面  统计出来应该有5种类别 并分别统计有多少条数据是属于这5种的
      

  7.   

    ID  Name   Category
    1   aaa    01;02;03
    2   bbb    01;03
    统计出来应该是3个类别01类别有两条数据02类别有一条数据03类别有两条数据
    01  2
    02  1
    03  2
      

  8.   

    那你对我4楼例中的value进行GROUP BY 不就行了?--sql 2000
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    goSELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b select value , count(*) cnt from
    (
      SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','
    ) t
    group by valueDROP TABLE #
    drop table tb--sql 2005
    create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    goselect value , count(*) cnt from
    (
      SELECT A.id, B.value
      FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
      )A
      OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
      )B
    ) t
    group by valuedrop table tb