求助,sql查询分组的问题

kezhikui 2014-01-10 11:23:09
假设有如下担保关系表
---------------------
担保人 被担保人
A B
AA BB
B C
CC AA
BB AA
C A
---------------------
我想要分组排序的结果:
---------------------
担保人 被担保人
A B
B C
C A
AA BB
BB CC
CC AA
----------------------
用sql语句能实现吗?
如果想再加一列组号如下:
---------------------
组号 担保人 被担保人
1 A B
1 B C
1 C A
2 AA BB
2 BB CC
2 CC AA
----------------------
到达上面显示的效果又该怎么做呢?

请高手帮忙指点一下!!!!!!!





...全文
270 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
竹叶青suhy 2014-01-10
  • 打赏
  • 举报
回复
嘿嘿,你走神了!
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
晕,我看错了,以为是要加自增列,select len(担保人),* from @table order by len(担保人),担保人就可以了
竹叶青suhy 2014-01-10
  • 打赏
  • 举报
回复
引用 8 楼 kezhikui 的回复:
能解释一下, select len(担保人),* from @table order by len(担保人),担保人 是什么意思吗?
len(担保人)取担保人这个字段的长度
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
能解释一下, select len(担保人),* from @table order by len(担保人),担保人 是什么意思吗?
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
额。。。那我再调调
主要是想找出三人循环担保的数据,并按组排序,上面的表只是一个例子。
竹叶青suhy 2014-01-10
  • 打赏
  • 举报
回复
declare @table table(担保人 varchar(10),被担保人 varchar(10))
insert @table
select 'A','B' union all
select 'AA','BB' union all
select 'B','C' union all
select 'CC','AA' union all
select 'BB','AA' union all
select 'C','A'

select len(担保人),* from @table order by len(担保人),担保人
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2014-01-10 11:28:05
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([担保人] varchar(2),[被担保人] varchar(2))
insert [huang]
select 'A','B' union all
select 'AA','BB' union all
select 'B','C' union all
select 'CC','AA' union all
select 'BB','AA' union all
select 'C','A'
--------------开始查询--------------------------
IF OBJECT_id('tempdb..#t','u')IS NOT NULL
DROP TABLE #t

select IDENTITY(INT,1,1) AS  id,*  INTO #t
from [huang]
ORDER BY LEN([担保人]),[担保人]
SELECT * FROM #t

----------------结果----------------------------
/*
id          担保人  被担保人
----------- ---- ----
1           A    B
2           B    C
3           C    A
4           AA   BB
5           BB   AA
6           CC   AA
 
*/
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
额。。。那我再调调
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2014-01-10 11:28:05
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([担保人] varchar(2),[被担保人] varchar(2))
insert [huang]
select 'A','B' union all
select 'AA','BB' union all
select 'B','C' union all
select 'CC','AA' union all
select 'BB','AA' union all
select 'C','A'
--------------开始查询--------------------------

select ROW_NUMBER()OVER(ORDER BY LEN([担保人]),[担保人])id,* from [huang]
ORDER BY id
----------------结果----------------------------
/*
id                   担保人  被担保人
-------------------- ---- ----
1                    A    B
2                    B    C
3                    C    A
4                    AA   BB
5                    BB   AA
6                    CC   AA
 
*/
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
sql server什么版本?
2000版本
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
sql server什么版本?
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
我觉得你插入的时候就应该记录对应关系,比如A担保B,这样循环也好办,2维表搞起来很麻烦
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
我现在写不出来新建3人循环小组表的sql代码呀。你帮帮我呗
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
我现在写不出来,新建3人循环担保表的sql代码呀。你帮帮我呗
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
可以试试,主要是2000的很多功能都不支持,要写多很多代码
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
是不是有且只有3人?比如不会有4人循环或者2人循环?
比如,能不能新建一个3人循环小组表,共4个字段:组号、担保人A内码、担保人B内码、担保人C内码。然后判断客户内码在哪个小组内,再将组号赋值给相应的字段,最后根据组号排序。 不知道这个方法是否可行。
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
暂时不知道怎么写了,只能搞出这个样子,也就是比如结果里面a.id=1的对应b.id=13 ,然后b.id=13对应a.id=12的,不知道怎么排序好了
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2014-01-10 14:01:50
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
--	Dec 28 2012 20:23:12 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([客户内码] bigint,[客户名称] varchar(5),[担保客户内码] bigint,[担保客户名称] varchar(5),[担保金额] int)
insert [huang]
select 81013817122,'尤*友',81013819401,'施*生',90000 union all
select 81013970312,'邵*东',81017614955,'刘*岳',160000 union all
select 81015764769,'陈*生',81036103438,'陈*军',200000 union all
select 81013819401,'施*生',81036208949,'尤*存',90000 union all
select 81013833410,'黄*女',81013879268,'柯*英',80000 union all
select 81013833410,'黄*女',81013879268,'柯*英',80000 union all
select 81013879268,'柯*英',81013881120,'林*林',80000 union all
select 81013881120,'林*林',81013833410,'黄*女',80000 union all
select 81013881120,'林*林',81013833410,'黄*女',80000 union all
select 81036208949,'尤*存',81013817122,'尤*友',200000 union all
select 81013842296,'郭*祥',81013970312,'邵*东',80000 union all
select 81017614955,'刘*岳',81013842296,'郭*祥',100000 union all
select 81030410199,'王*锋',81034723541,'卢*平',280000 union all
select 81036103438,'陈*军',81029291410,'陈*锋',120000 union all
select 81034723541,'卢*平',81013816842,'王*和',200000 union all
select 81013816842,'王*和',81030410199,'王*锋',400000 union all
select 81029291410,'陈*锋',81015764769,'陈*生',210000
--------------开始查询--------------------------

IF OBJECT_ID('tempdb..#t','u')IS NOT NULL 
DROP TABLE #t
IF OBJECT_ID('tempdb..#t2','u')IS NOT NULL 
DROP TABLE #t2
SELECT DISTINCT  a.[客户内码] AS [担保人A],b.[客户内码] AS [担保人B],c.[客户内码] AS [担保人C],a.[担保金额] AS [担保金额A],b.[担保金额] AS [担保金额B],c.[担保金额] AS [担保金额C] INTO #t
FROM huang a INNER JOIN huang b ON a.[担保客户内码]=b.[客户内码]
INNER JOIN huang c ON b.[担保客户内码]=c.[客户内码] AND c.[担保客户内码]=a.[客户内码]

SELECT *,IDENTITY(INT,1,1) id INTO #t2
FROM (
SELECT 担保人A,担保人B,担保金额B
FROM #t
UNION  
SELECT 担保人B,担保人C,担保金额C
FROM #t
UNION  
SELECT 担保人C,担保人A,担保金额A
FROM #t)a

SELECT *
FROM #t2 a full JOIN #t2 b ON a.担保人A=b.担保人B


----------------结果----------------------------
/*
担保人A                 担保人B                 担保金额B       id          担保人A                 担保人B                 担保金额B       id
-------------------- -------------------- ----------- ----------- -------------------- -------------------- ----------- -----------
81013816842          81030410199          280000      1           81034723541          81013816842          400000      13
81013817122          81013819401          90000       2           81036208949          81013817122          90000       15
81013819401          81036208949          200000      3           81013817122          81013819401          90000       2
81013833410          81013879268          80000       4           81013881120          81013833410          80000       7
81013842296          81013970312          160000      5           81017614955          81013842296          80000       10
81013879268          81013881120          80000       6           81013833410          81013879268          80000       4
81013881120          81013833410          80000       7           81013879268          81013881120          80000       6
81013970312          81017614955          100000      8           81013842296          81013970312          160000      5
81015764769          81036103438          120000      9           81029291410          81015764769          200000      11
81017614955          81013842296          80000       10          81013970312          81017614955          100000      8
81029291410          81015764769          200000      11          81036103438          81029291410          210000      14
81030410199          81034723541          200000      12          81013816842          81030410199          280000      1
81034723541          81013816842          400000      13          81030410199          81034723541          200000      12
81036103438          81029291410          210000      14          81015764769          81036103438          120000      9
81036208949          81013817122          90000       15          81013819401          81036208949          200000      3 
*/
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
版主大大,提供一点思路,帮忙帮忙呀。
kezhikui 2014-01-10
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
是不是有且只有3人?比如不会有4人循环或者2人循环?
只有三个人循环的,但是一组记录可能会超过3条,因为存在比如某个人给同一个人担保2笔或2笔以上的情况。
發糞塗牆 2014-01-10
  • 打赏
  • 举报
回复
是不是有且只有3人?比如不会有4人循环或者2人循环?
加载更多回复(7)

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧