如下表:
A B
A1 56
A2 41
A3 52
A4 11
A5 54
A6 64
A7 20
A8 55
A9 79
A10 56
A11 92
A12 75
A13 36
… …
如何能用SQL语句对A列的值进行循环比较,而又不重复,即A1-A2,A1-A3,A1-A4..A2-A3,A2-A4...A12-A13。。
即是开始A1-A2之后不会后面又出现A2-A1这样的重复比较,请教大虾,谢谢!!!!!!!!!!!!!!
A B
A1 56
A2 41
A3 52
A4 11
A5 54
A6 64
A7 20
A8 55
A9 79
A10 56
A11 92
A12 75
A13 36
… …
如何能用SQL语句对A列的值进行循环比较,而又不重复,即A1-A2,A1-A3,A1-A4..A2-A3,A2-A4...A12-A13。。
即是开始A1-A2之后不会后面又出现A2-A1这样的重复比较,请教大虾,谢谢!!!!!!!!!!!!!!
-- Author : htl258(Tony)
-- Date : 2010-03-27 18:24:51
-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([A] NVARCHAR(10),[B] INT)
INSERT [tb]
SELECT 'A1',56 UNION ALL
SELECT 'A2',41 UNION ALL
SELECT 'A3',52 UNION ALL
SELECT 'A4',11 UNION ALL
SELECT 'A5',54 UNION ALL
SELECT 'A6',64 UNION ALL
SELECT 'A7',20 UNION ALL
SELECT 'A8',55 UNION ALL
SELECT 'A9',79 UNION ALL
SELECT 'A10',56 UNION ALL
SELECT 'A11',92 UNION ALL
SELECT 'A12',75 UNION ALL
SELECT 'A13',36
GO
--SELECT * FROM [tb]-->SQL查询如下:
select *
from tb a
join tb b
on STUFF(a.a,1,1,'')*1<STUFF(b.a,1,1,'')*1
order by STUFF(a.a,1,1,'')*1
/*
A B A B
---------- ----------- ---------- -----------
A1 56 A2 41
A1 56 A3 52
A1 56 A4 11
A1 56 A5 54
A1 56 A6 64
A1 56 A7 20
A1 56 A8 55
A1 56 A9 79
A1 56 A10 56
A1 56 A11 92
A1 56 A12 75
A1 56 A13 36
A2 41 A3 52
A2 41 A4 11
A2 41 A5 54
A2 41 A6 64
A2 41 A7 20
A2 41 A8 55
A2 41 A9 79
A2 41 A10 56
A2 41 A11 92
A2 41 A12 75
A2 41 A13 36
A3 52 A4 11
A3 52 A5 54
A3 52 A6 64
A3 52 A7 20
A3 52 A8 55
A3 52 A9 79
A3 52 A10 56
A3 52 A11 92
A3 52 A12 75
A3 52 A13 36
A4 11 A5 54
A4 11 A6 64
A4 11 A7 20
A4 11 A8 55
A4 11 A9 79
A4 11 A10 56
A4 11 A11 92
A4 11 A12 75
A4 11 A13 36
A5 54 A6 64
A5 54 A7 20
A5 54 A8 55
A5 54 A9 79
A5 54 A10 56
A5 54 A11 92
A5 54 A12 75
A5 54 A13 36
A6 64 A7 20
A6 64 A8 55
A6 64 A9 79
A6 64 A10 56
A6 64 A11 92
A6 64 A12 75
A6 64 A13 36
A7 20 A8 55
A7 20 A9 79
A7 20 A10 56
A7 20 A11 92
A7 20 A12 75
A7 20 A13 36
A8 55 A9 79
A8 55 A10 56
A8 55 A11 92
A8 55 A12 75
A8 55 A13 36
A9 79 A10 56
A9 79 A11 92
A9 79 A12 75
A9 79 A13 36
A10 56 A11 92
A10 56 A12 75
A10 56 A13 36
A11 92 A12 75
A11 92 A13 36
A12 75 A13 36(78 行受影响)*/这样?
DROP TABLE [tb]
GO
CREATE TABLE [tb]([A] NVARCHAR(10),[B] INT)
INSERT [tb]
SELECT 'A1',56 UNION ALL
SELECT 'A2',41 UNION ALL
SELECT 'A3',52 UNION ALL
SELECT 'A4',11 UNION ALL
SELECT 'A5',54 UNION ALL
SELECT 'A6',64 UNION ALL
SELECT 'A7',20 UNION ALL
SELECT 'A8',55 UNION ALL
SELECT 'A9',79 UNION ALL
SELECT 'A10',56 UNION ALL
SELECT 'A11',92 UNION ALL
SELECT 'A12',75 UNION ALL
SELECT 'A13',36
GO
--SELECT * FROM [tb]-->SQL查询如下:
select a.A AA,a.B AB,b.A BA,b.B BB,a.B-b.B 差额
from tb a
join tb b
on STUFF(a.a,1,1,'')*1<STUFF(b.a,1,1,'')*1
order by STUFF(a.a,1,1,'')*1,STUFF(b.a,1,1,'')*1
/*
AA AB BA BB 差额
---------- ----------- ---------- ----------- -----------
A1 56 A2 41 15
A1 56 A3 52 4
A1 56 A4 11 45
A1 56 A5 54 2
A1 56 A6 64 -8
A1 56 A7 20 36
A1 56 A8 55 1
A1 56 A9 79 -23
A1 56 A10 56 0
A1 56 A11 92 -36
A1 56 A12 75 -19
A1 56 A13 36 20
A2 41 A3 52 -11
A2 41 A4 11 30
A2 41 A5 54 -13
A2 41 A6 64 -23
A2 41 A7 20 21
A2 41 A8 55 -14
A2 41 A9 79 -38
A2 41 A10 56 -15
A2 41 A11 92 -51
A2 41 A12 75 -34
A2 41 A13 36 5
A3 52 A4 11 41
A3 52 A5 54 -2
A3 52 A6 64 -12
A3 52 A7 20 32
A3 52 A8 55 -3
A3 52 A9 79 -27
A3 52 A10 56 -4
A3 52 A11 92 -40
A3 52 A12 75 -23
A3 52 A13 36 16
A4 11 A5 54 -43
A4 11 A6 64 -53
A4 11 A7 20 -9
A4 11 A8 55 -44
A4 11 A9 79 -68
A4 11 A10 56 -45
A4 11 A11 92 -81
A4 11 A12 75 -64
A4 11 A13 36 -25
A5 54 A6 64 -10
A5 54 A7 20 34
A5 54 A8 55 -1
A5 54 A9 79 -25
A5 54 A10 56 -2
A5 54 A11 92 -38
A5 54 A12 75 -21
A5 54 A13 36 18
A6 64 A7 20 44
A6 64 A8 55 9
A6 64 A9 79 -15
A6 64 A10 56 8
A6 64 A11 92 -28
A6 64 A12 75 -11
A6 64 A13 36 28
A7 20 A8 55 -35
A7 20 A9 79 -59
A7 20 A10 56 -36
A7 20 A11 92 -72
A7 20 A12 75 -55
A7 20 A13 36 -16
A8 55 A9 79 -24
A8 55 A10 56 -1
A8 55 A11 92 -37
A8 55 A12 75 -20
A8 55 A13 36 19
A9 79 A10 56 23
A9 79 A11 92 -13
A9 79 A12 75 4
A9 79 A13 36 43
A10 56 A11 92 -36
A10 56 A12 75 -19
A10 56 A13 36 20
A11 92 A12 75 17
A11 92 A13 36 56
A12 75 A13 36 39(78 行受影响)*/
select a.a,b.a,a.b,b.b from (
SELECT *,ROW_ID=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM #TT
) a ,(SELECT *,ROW_ID=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM #TT
) b
where a.ROW_ID<b.ROW_ID
order by a.ROW_IDa a b b
---------- ---------- ----------- -----------
A1 A2 56 41
A1 A3 56 52
A1 A4 56 11
A1 A5 56 54
A1 A6 56 64
A1 A7 56 20
A1 A8 56 55
A1 A9 56 79
A1 A10 56 56
A1 A11 56 92
A1 A12 56 75
A1 A13 56 36
A2 A3 41 52
A2 A4 41 11
A2 A5 41 54
A2 A6 41 64
A2 A7 41 20
A2 A8 41 55
A2 A9 41 79
A2 A10 41 56
A2 A11 41 92
A2 A12 41 75
A2 A13 41 36
A3 A4 52 11
A3 A5 52 54
A3 A6 52 64
A3 A7 52 20
A3 A8 52 55
A3 A9 52 79
A3 A10 52 56
A3 A11 52 92
A3 A12 52 75
A3 A13 52 36
A4 A5 11 54
A4 A6 11 64
A4 A7 11 20
A4 A8 11 55
A4 A9 11 79
A4 A10 11 56
A4 A11 11 92
A4 A12 11 75
A4 A13 11 36
A5 A6 54 64
A5 A7 54 20
A5 A8 54 55
A5 A9 54 79
A5 A10 54 56
A5 A11 54 92
A5 A12 54 75
A5 A13 54 36
A6 A7 64 20
A6 A8 64 55
A6 A9 64 79
A6 A10 64 56
A6 A11 64 92
A6 A12 64 75
A6 A13 64 36
A7 A8 20 55
A7 A9 20 79
A7 A10 20 56
A7 A11 20 92
A7 A12 20 75
A7 A13 20 36
A8 A9 55 79
A8 A10 55 56
A8 A11 55 92
A8 A12 55 75
A8 A13 55 36
A9 A10 79 56
A9 A11 79 92
A9 A12 79 75
A9 A13 79 36
A10 A11 56 92
A10 A12 56 75
A10 A13 56 36
A11 A12 92 75
A11 A13 92 36
A12 A13 75 36(78 行受影响)
select a.a as aa,b.a as ba,a.b as ab,b.b as bb,a.b-b.b as 差额
from (
SELECT *,ROW_ID=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM #TT
) a ,(SELECT *,ROW_ID=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM #TT
) b
where a.ROW_ID<b.ROW_ID
order by a.ROW_ID
aa ba ab bb 差额
---------- ---------- ----------- ----------- -----------
A1 A2 56 41 15
A1 A3 56 52 4
A1 A4 56 11 45
A1 A5 56 54 2
A1 A6 56 64 -8
A1 A7 56 20 36
A1 A8 56 55 1
A1 A9 56 79 -23
A1 A10 56 56 0
A1 A11 56 92 -36
A1 A12 56 75 -19
A1 A13 56 36 20
A2 A3 41 52 -11
A2 A4 41 11 30
A2 A5 41 54 -13
A2 A6 41 64 -23
A2 A7 41 20 21
A2 A8 41 55 -14
A2 A9 41 79 -38
A2 A10 41 56 -15
A2 A11 41 92 -51
A2 A12 41 75 -34
A2 A13 41 36 5
A3 A4 52 11 41
A3 A5 52 54 -2
A3 A6 52 64 -12
A3 A7 52 20 32
A3 A8 52 55 -3
A3 A9 52 79 -27
A3 A10 52 56 -4
A3 A11 52 92 -40
A3 A12 52 75 -23
A3 A13 52 36 16
A4 A5 11 54 -43
A4 A6 11 64 -53
A4 A7 11 20 -9
A4 A8 11 55 -44
A4 A9 11 79 -68
A4 A10 11 56 -45
A4 A11 11 92 -81
A4 A12 11 75 -64
A4 A13 11 36 -25
A5 A6 54 64 -10
A5 A7 54 20 34
A5 A8 54 55 -1
A5 A9 54 79 -25
A5 A10 54 56 -2
A5 A11 54 92 -38
A5 A12 54 75 -21
A5 A13 54 36 18
A6 A7 64 20 44
A6 A8 64 55 9
A6 A9 64 79 -15
A6 A10 64 56 8
A6 A11 64 92 -28
A6 A12 64 75 -11
A6 A13 64 36 28
A7 A8 20 55 -35
A7 A9 20 79 -59
A7 A10 20 56 -36
A7 A11 20 92 -72
A7 A12 20 75 -55
A7 A13 20 36 -16
A8 A9 55 79 -24
A8 A10 55 56 -1
A8 A11 55 92 -37
A8 A12 55 75 -20
A8 A13 55 36 19
A9 A10 79 56 23
A9 A11 79 92 -13
A9 A12 79 75 4
A9 A13 79 36 43
A10 A11 56 92 -36
A10 A12 56 75 -19
A10 A13 56 36 20
A11 A12 92 75 17
A11 A13 92 36 56
A12 A13 75 36 39(78 行受影响)
-- Author :fredrickhu(小F,向高手学习)
-- Date :2010-03-27 20:11:39
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([A] varchar(3),[B] int)
insert [tb]
select 'A1',56 union all
select 'A2',41 union all
select 'A3',52 union all
select 'A4',11 union all
select 'A5',54 union all
select 'A6',64 union all
select 'A7',20 union all
select 'A8',55 union all
select 'A9',79 union all
select 'A10',56 union all
select 'A11',92 union all
select 'A12',75 union all
select 'A13',36
--------------开始查询--------------------------
select
a.a as a,b.a as b,a.b as c,b.b as d,a.b-b.b as 差额
from
(select *,id=row_number() over(order by getdate()) from tb) a
cross join
(select *,id=row_number() over(order by getdate()) from tb) b
where
a.id<b.id
order by
a.id
----------------结果----------------------------
/*
(13 行受影响)
a b c d 差额
---- ---- ----------- ----------- -----------
A1 A2 56 41 15
A1 A3 56 52 4
A1 A4 56 11 45
A1 A5 56 54 2
A1 A6 56 64 -8
A1 A7 56 20 36
A1 A8 56 55 1
A1 A9 56 79 -23
A1 A10 56 56 0
A1 A11 56 92 -36
A1 A12 56 75 -19
A1 A13 56 36 20
A2 A3 41 52 -11
A2 A4 41 11 30
A2 A5 41 54 -13
A2 A6 41 64 -23
A2 A7 41 20 21
A2 A8 41 55 -14
A2 A9 41 79 -38
A2 A10 41 56 -15
A2 A11 41 92 -51
A2 A12 41 75 -34
A2 A13 41 36 5
A3 A4 52 11 41
A3 A5 52 54 -2
A3 A6 52 64 -12
A3 A7 52 20 32
A3 A8 52 55 -3
A3 A9 52 79 -27
A3 A10 52 56 -4
A3 A11 52 92 -40
A3 A12 52 75 -23
A3 A13 52 36 16
A4 A5 11 54 -43
A4 A6 11 64 -53
A4 A7 11 20 -9
A4 A8 11 55 -44
A4 A9 11 79 -68
A4 A10 11 56 -45
A4 A11 11 92 -81
A4 A12 11 75 -64
A4 A13 11 36 -25
A5 A6 54 64 -10
A5 A7 54 20 34
A5 A8 54 55 -1
A5 A9 54 79 -25
A5 A10 54 56 -2
A5 A11 54 92 -38
A5 A12 54 75 -21
A5 A13 54 36 18
A6 A7 64 20 44
A6 A8 64 55 9
A6 A9 64 79 -15
A6 A10 64 56 8
A6 A11 64 92 -28
A6 A12 64 75 -11
A6 A13 64 36 28
A7 A8 20 55 -35
A7 A9 20 79 -59
A7 A10 20 56 -36
A7 A11 20 92 -72
A7 A12 20 75 -55
A7 A13 20 36 -16
A8 A9 55 79 -24
A8 A10 55 56 -1
A8 A11 55 92 -37
A8 A12 55 75 -20
A8 A13 55 36 19
A9 A10 79 56 23
A9 A11 79 92 -13
A9 A12 79 75 4
A9 A13 79 36 43
A10 A11 56 92 -36
A10 A12 56 75 -19
A10 A13 56 36 20
A11 A12 92 75 17
A11 A13 92 36 56
A12 A13 75 36 39(78 行受影响)
*/
SELECT a.A AA,a.B AB,b.A BA,b.B BB,UQ=CASE WHEN a.B<>b.B THEN '不等:相差'+CAST((a.B-b.b) AS VARCHAR(50)) ELSE '相等' END
FROM tb a
JOIN tb b
ON STUFF(a.A,1,1,null)*1<STUFF(b.A,1,1,null)*1
ORDER BY STUFF(a.A,1,1,null)*1
--通用方法,该方法适用sql2005以上版本,要想适合sql2000则可以先往临时表里面导,可以达到同样的效果
SELECT *
FROM
(
SELECT A,B,[ID]=ROW_NUMBER() OVER(ORDER BY A) FROM tb
) AS A
JOIN
(
SELECT A,B,[ID]=ROW_NUMBER() OVER(ORDER BY A) FROM tb
) AS B
ON A.ID<B.ID
ORDER BY A.A
--如N行到M行(M>N)
select top (M-N) * from tablename where id not in (select top N id from tablename)
--id 为字段名
from 如下表 a ,如下表 b
where a.A<b.A