统计问题,请高手帮忙,非常谢谢!
问题描述如下:假如有一个表shiyan
id a b c d e
11346NULL
2234NULLNULL
3123NULLNULL
426NULLNULLNULL
52345NULL
6235NULLNULL
712346
813456
91NULLNULLNULLNULL
要求统计出如下结果:
1 3 4 3
1 3 6 3
1 4 6 3
2 3 4 3
3 4 6 3
具体的描述是:以1 3 4 为例,在id=1的时候有,所以计数为1,id=7的时候也包含1 3 4,所以计数再加一,此时计数为2,在id=8的时候也包含1 3 4,所以计数再加1,此时的计数总数为3,也就是说,只要某一行里面包含1 3 4,计数就加1,不管顺序如何,只要某一行同时包含1 3 4这三个数,(不管他们的顺序是1 3 4还是1 4 3,还是4 3 1)它的计数就加一,最后要求显示出计数大于等于3的,也就是
1 3 4 3
1 3 6 3
1 4 6 3
2 3 4 3
3 4 6 3
请高手帮忙解决一下,用sql语句实现。
小弟我非常感激!
[解决办法]
--呵呵,又是我
declare @shiyan1 table(id int, a int, b int,c int, d int, e int)
insert @shiyan1 select 1,1, 3,4, 6, NULL
union all select 2,2, 3,4, NULL, NULL
union all select 3,1, 2,3, NULL, NULL
union all select 4,2, 6,NULL, NULL, NULL
union all select 5,2, 3,4, 5, NULL
union all select 6,2, 3,5, NULL, NULL
union all select 7,1, 2,3, 4, 6
union all select 8,1, 3,4, 5, 6
union all select 9,1,NULL, NULL, NULL,NULL
declare @shiyan2 table(id int, a int, b int,c int)
insert @shiyan2 select 1,1 , 3,4
union all select 2,1 , 3,6
union all select 3,1, 4,6
union all select 4,2 , 3,4
union all select 5,3 , 4,6
--select * from @shiyan1
--select * from @shiyan2
select *,
(select count(*) from @shiyan1 where (t.a=a or t.a=b or t.a=c or t.a=d or t.a=e) and
(t.b=a or t.b=b or t.b=c or t.b=d or t.b=e) and
(t.c=a or t.c=b or t.c=c or t.c=d or t.c=e)
) 个数
from @shiyan2 t
--结果
id a b c 个数
----------- ----------- ----------- ----------- -----------
1 1 3 4 3
2 1 3 6 3
3 1 4 6 3
4 2 3 4 3
5 3 4 6 3
(所影响的行数为 5 行)
[解决办法]
create table A(id int, a int, b int, c int, d int, e int)
insert A select 1, 1, 3, 4, 6, NULL
union all select 2, 2, 3, 4, NULL, NULL
union all select 3, 1, 2, 3, NULL, NULL
union all select 4, 2, 6, NULL, NULL, NULL
union all select 5, 2, 3, 4, 5, NULL
union all select 6, 2, 3, 5, NULL, NULL
union all select 7, 1, 2, 3, 4, 6
union all select 8, 1, 3, 4, 5, 6
union all select 9, 1, NULL, NULL, NULL, NULL
create table B(id int, a int, b int, c int)
insert B select 1, 1, 3, 4
union all select 2, 1, 3, 6
union all select 3, 1, 4, 6
union all select 4, 2, 3, 4
union all select 5, 3, 4, 6
select *,
num=(select sum(num) from
(
select
num =
(select count(distinct a) from
(select a union all select b union all select c union all select d union all select e) tmpA
where tmpA.a in(B.a, B.b, B.c)) / 3
from A
) tmp)
from B
--result
id a b c num
----------- ----------- ----------- ----------- -----------
1 1 3 4 3
2 1 3 6 3
3 1 4 6 3
4 2 3 4 3
5 3 4 6 3
(5 row(s) affected)