首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于多表查询统计有关问题?(祝各位新年快乐!)

2011-12-27 
关于多表查询统计问题?(祝各位新年快乐!)表1:编号标志使用人时间代号100011李山2007-01-062001100021李山2

关于多表查询统计问题?(祝各位新年快乐!)
表1:
编号             标志             使用人                 时间                   代号
10001               1                   李山             2007-01-06               2001
10002               1                   李山             2007-01-09               2001
10005               2                   李山             2007-01-09               2002
10007               2                   赵兴             2007-01-08               2002
10009               2                   赵兴             2007-01-08               2002
10010               1                   张立             2007-01-12               2003
10011               1                   张立             2007-01-12               2003
10012               1                   张立             2007-01-20               2004

表2:
      代号               部门
      2001         一车间
      2002         一车间
      2003         二车间
      2004         二车间
      2005             三车间

表3:
      编号             时间
    10001           2007-02-08
    10001           2007-02-09
    10002           2007-01-10
    10005           2007-01-11
    10005           2007-01-09
    10007           2007-01-10
    10008           2007-01-10
    10009           2007-01-09
    10011           2007-01-12
    10012           2007-01-20
        我想分别统计出:在表一中 '使用人 '当 '标志 '分别等于1和2,并且时间在2007-01-06至2007-01-20之间在表二中 '部门 '等于 '一车间 '的 '编号 '数,以及按上述条件外再加上在2007-01-06至2007-01-20之间表一中的 '编号 '在表三中存在的条件。根据所列数据得到结果如下:
使用人     tj1     tj2     tj3     tj4
  李山         2         1         1         1


  赵兴         0         2         0         2
        tj1为标志等于1的编号数,tj2为标志等于2的编号数,tj3为在表3存且标志等于1的编号数,tj4为在表3存且标志等于2的编号数,我写的代码如下:
SELECT   表1.使用人,   SUM(CASE   WHEN   表1.标志   =   '1 '   THEN   1   ELSE   0   END)   AS   tj1,   SUM(CASE   WHEN   表1.标志   =   '2 '   THEN   1   ELSE   0   END)   AS   tj2,SUM(CASE   WHEN   表1.标志   =   '1 '   and   表1.编号   in   (select   表3.编号   from   表3   where   表3.时间> = '2007-01-01 '   and   表3.时间 <= '2007-02-15 ')   THEN   1   ELSE   0   END)   AS   tj3,SUM(CASE   WHEN   表1.标志   =   '2 '   and   表1.编号   in   (select   表3.编号   from   表3   where   表3.时间> = '2007-01-01 '   and   表3.时间 <= '2007-02-15 ')   THEN   1   ELSE   0   END)   AS   tj4
FROM   gwkh   INNER   JOIN
            wdh   ON   表1.代码   =   表2.代码   AND   表2.部门   =   '一车间 '
WHERE   (表1.时间   > =   '2007-01-01 ')   AND   (表1.时间   <=   '2007-02-15 ')
GROUP   BY   表1.使用人
ORDER   BY   表1.使用人
但出错提示“不能对包含聚合或子查询的表达式执行聚合函数”望前辈指教,并祝春节快乐!!


[解决办法]
select 使用人,
tj1=(select count(1) from 表1 where 使用人=a.使用人 and 标志= '1 '
and 时间 between '2007-01-06 ' and '2007-01-20 ' and 代号 in (select 代号 from 表2)),
tj2=(select count(1) from 表1 where 使用人=a.使用人 and 标志= '2 '
and 时间 between '2007-01-06 ' and '2007-01-20 ' and 代号 in (select 代号 from 表2)),
tj3=(select count(1) from 表1 where 使用人=a.使用人 and 标志= '1 '
and 时间 between '2007-01-06 ' and '2007-01-20 ' and 代号 in (select 代号 from 表2) and 编号 in (select 编号 from 表3 where 时间 between '2007-01-06 ' and '2007-01-20 ')),
tj4=(select count(1) from 表1 where 使用人=a.使用人 and 标志= '2 '
and 时间 between '2007-01-06 ' and '2007-01-20 ' and 代号 in (select 代号 from 表2) and 编号 in (select 编号 from 表3 where 时间 between '2007-01-06 ' and '2007-01-20 '))
from 表1 a group by 使用人

热点排行