数据结构是这样的问题  答案   回答人选择题1(你是哪里人)  (上海)     小王
选择题2(你是工作是)  (老师)     小王
选择题1(你是哪里人)  (北京)     小明
选择题2(你是工作是)  (律师)     小明
选择题1(你是哪里人)  (上海)     小张
选择题2(你是工作是)  (医生)     小张要的效果是
选择(上海)的人里面
选择(老师)的人数是1
选择(律师)的人数是0
选择(医生)的人数是1选择(北京)的人里面
选择(老师)的人数是0
选择(律师的人数是1
选择(医生)的人数是0这个SQL语句好写么?先万分感谢!!!

解决方案 »

  1.   

    这样表述行不:
    create table tb(问题 nvarchar(20),答案 nvarchar(10),回答人 nvarchar(10))
    insert into tb select '选择题1(你是哪里人)','(上海)','小王'
    insert into tb select '选择题2(你是工作是)','(老师)','小王'
    insert into tb select '选择题1(你是哪里人)','(北京)','小明'
    insert into tb select '选择题2(你是工作是)','(律师)','小明'
    insert into tb select '选择题1(你是哪里人)','(上海)','小张'
    insert into tb select '选择题2(你是工作是)','(医生)','小张'
    go
    select a.地点,a.工作,sum(case when b.地点 is null then 0 else 1 end) 人数 from(
    select b.答案 地点,a.答案 工作 from
    (select distinct 答案 from tb where 问题='选择题2(你是工作是)')a,
    (select distinct 答案 from tb where 问题='选择题1(你是哪里人)')b
    )a left join (
    select a.答案 地点,b.答案 工作 from tb a inner join tb b
     on a.回答人=b.回答人 and a.问题='选择题1(你是哪里人)' and b.问题='选择题2(你是工作是)'
    )b on a.地点=b.地点 and a.工作=b.工作
    group by a.地点,a.工作
    order by a.地点
    /*
    地点         工作         人数
    ---------- ---------- -----------
    (北京)       (老师)       0
    (北京)       (律师)       1
    (北京)       (医生)       0
    (上海)       (老师)       1
    (上海)       (律师)       0
    (上海)       (医生)       1(6 行受影响)*/
    go
    drop table tb
      

  2.   

    --我加上一个序号.
    create table tb(id int,问题 nvarchar(20),答案 nvarchar(10),回答人 nvarchar(10))
    insert into tb values(1,'选择题1(你是哪里人)','上海','小王')
    insert into tb values(2,'选择题2(你是工作是)','老师','小王')
    insert into tb values(3,'选择题1(你是哪里人)','北京','小明')
    insert into tb values(4,'选择题2(你是工作是)','律师','小明')
    insert into tb values(5,'选择题1(你是哪里人)','上海','小张')
    insert into tb values(6,'选择题2(你是工作是)','医生','小张')
    goselect t1.*,t2.* , isnull(t3.人数,0) 人数 from 
    (select distinct 答案 地点 from tb where charindex('你是哪里人',问题) > 0) t1 cross join
    (select distinct 答案 职业 from tb where charindex('你是哪里人',问题) = 0) t2
    left join
    (select m.答案 地点, n.答案 职业 , count(1) 人数 From tb m , tb n where m.id%2 = 1 and m.id = n.id - 1 group by m.答案 , n.答案) t3
    on t1.地点 = t3.地点 and t2.职业 = t3.职业 drop table tb/*
    地点         职业         人数          
    ---------- ---------- ----------- 
    北京         老师         0
    北京         律师         1
    北京         医生         0
    上海         老师         1
    上海         律师         0
    上海         医生         1(所影响的行数为 6 行)*/