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

请问:怎么查询统计两行数据间同时存在值的个数

2012-12-26 
请教:如何查询统计两行数据间同时存在值的个数例如 :列名 :idT1T2T3T4T5T6T7A78726089579372B817178729077

请教:如何查询统计两行数据间同时存在值的个数
例如 :
       列名 :   id   T1  T2  T3  T4  T5  T6  T7
                 A    78  72  60  89  57  93  72
                 B    81  71  78  72  90  77  73
  A记录和B记录共有相同的值有2个 ,为72,78。 急问这个怎么用sql解决? 谢谢!!
[最优解释]
create table #A(id varchar(20),t1 int,t2 int ,t3 int ,t4 int,t5 int,t6 int,t7 int)
insert into #A
select 'A',78 , 72 ,  60 ,  89 ,  57,   93,   72
union all
 select 'B',  81 , 71 , 78 , 72 , 90 , 77 , 73
 ---测试
 with TB as(
 select * from #A
 unpivot(va for tt in ([t1],[t2],[t3],[t4],[t5],[t6],[t7])) as b)
 
 select VA from TB where id='A'
 intersect
 select VA from TB where id='b'
[其他解释]


if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (id nvarchar(2),T1 int,T2 int,T3 int,T4 int,T5 int,T6 int,T7 int)
insert into [TB]
select 'A',78,72,60,89,57,93,72 union all
select 'B',81,71,78,72,90,77,73

select * from [TB]

SELECT DISTINCT N.num
FROM    ( SELECT  *
            FROM    ( SELECT    id ,
                                'T1' AS col ,
                                T1 AS num
                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,
                                'T2' AS col ,
                                T2 AS num


                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,
                                'T3' AS col ,
                                T3 AS num
                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,
                                'T4' AS col ,
                                T4 AS num
                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,
                                'T5' AS col ,
                                T5 AS num
                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,


                                'T6' AS col ,
                                T6 AS num
                      FROM      TB
                      WHERE     id = 'A'
                      UNION ALL
                      SELECT    id ,
                                'T7' AS col ,
                                T7 AS num
                      FROM      TB
                      WHERE     id = 'A'
                    ) A
          ) N
          INNER JOIN ( SELECT   *
                       FROM     ( SELECT    id ,
                                            'T1' AS col ,
                                            T1 AS num
                                  FROM      TB
                                  WHERE     id = 'B'
                                  UNION ALL
                                  SELECT    id ,


                                            'T2' AS col ,
                                            T2 AS num
                                  FROM      TB
                                  WHERE     id = 'B'
                                  UNION ALL
                                  SELECT    id ,
                                            'T3' AS col ,
                                            T3 AS num
                                  FROM      TB
                                  WHERE     id = 'B'
                                  UNION ALL
                                  SELECT    id ,
                                            'T4' AS col ,
                                            T4 AS num
                                  FROM      TB
                                  WHERE     id = 'B'


                                  UNION ALL
                                  SELECT    id ,
                                            'T5' AS col ,
                                            T5 AS num
                                  FROM      TB
                                  WHERE     id = 'B'
                                  UNION ALL
                                  SELECT    id ,
                                            'T6' AS col ,
                                            T6 AS num
                                  FROM      TB
                                  WHERE     id = 'B'
                                  UNION ALL
                                  SELECT    id ,
                                            'T7' AS col ,
                                            T7 AS num


                                  FROM      TB
                                  WHERE     id = 'B'
                                ) B
                     ) T ON N.num = T.num

--出来的结果lz可以拼接一下,就是你要的样式了。 


[其他解释]
好牛, 如果是查找比A行相差1的个数 怎么求?
即得到 71,73,90
引用:
create table #A(id varchar(20),t1 int,t2 int ,t3 int ,t4 int,t5 int,t6 int,t7 int)
insert into #A
select 'A',78 , 72 ,  60 ,  89 ,  57,   93,   72
union all
 select 'B',  81 , 71 , 78……

[其他解释]
 with TB as(
 select * from #A
 unpivot(va for tt in ([t1],[t2],[t3],[t4],[t5],[t6],[t7])) as b)
 
 select VA+1 from TB where id='A'
 intersect
 select VA from TB where id='b'
搞不懂71 怎么来的。。。
[其他解释]
谢谢 71 是相差1 包括了 大1和小1的数 
不过还想问问怎么求交集的个数 
我试了

 select COUNT(VA) from TB where id='A'
 intersect
 select VA from TB where id='b'
结果不对,即使是有1个交集,结果也会莫名其妙的为空,我试了下用 select COUNT(VA) from TB where VA in ( select VA from TB where id='A'
 intersect
 select VA from TB where id='b') 这样计算结果是正确的,但效率非常低,30万行的数据要跑10多分钟,有没什么方法能求集合的个数,包括把NULL值赋值成0?
再次感谢你的帮助~~~


引用:
with TB as(
 select * from #A
 unpivot(va for tt in ([t1],[t2],[t3],[t4],[t5],[t6],[t7])) as b)
 
 select VA+1 from TB where id='A'
 intersect
 select VA from TB where id='b'
搞不懂7……

[其他解释]
select COUNT(1) 
from ( select VA from TB where id='A'
  intersect
  select VA from TB where id='b') as A
[其他解释]
哈哈 谢谢  测试了下发现count(1) 效率也很慢,2行数据的测试都要4秒,但我换成count(0)后效果明显,只要1秒了!  

引用:
select COUNT(1) 
from ( select VA from TB where id='A'
  intersect
  select VA from TB where id='b') as A

热点排行