读书人

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

发布时间: 2012-12-26 14:39:28 作者: rapoo

请教:如何查询统计两行数据间同时存在值的个数
例如 :
列名 : 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

读书人网 >SQL Server

热点推荐