日期:2014-05-17  浏览次数:20601 次

每组一只一条
人员分组表
SQL code

组编号 组员姓名 组员信息1 组员信息2 。。。
001     张三     汉族      团员



现在要找满足条件的组,该组只要一个组员满足 要求的条件,这个组就满足

select * from 人员分组表 where 组员信息1 = 'aaa' and 组员信息2 = 'bbb' and ...
order by 组编号

这样,会得到结果,但每个组可能有多名组员被查出来,其实每组只需要一个就行了。怎么查呢?

------解决方案--------------------
SQL code
CREATE TABLE test
 (
[组编号] varchar(10),
[组员姓名] varchar(10),
[组员信息1] varchar(10),
[组员信息2]varchar(10)

 )
INSERT INTO test
SELECT '001',     '张三','汉族',      '团员'
UNION ALL 
SELECT '001',     '张三1','汉族',      '团员'
UNION ALL 
SELECT '002',     '张三','汉族',      '团员'
UNION ALL 
SELECT '002',     '张三1','汉族',      '团员'

SELECT * FROM (
SELECT NTILE(10) OVER(PARTITION BY [组编号],[组员信息1],[组员信息2] ORDER BY [组编号])id,* FROM test WHERE [组员信息1]='汉族' AND [组员信息2]='团员')b
WHERE id=1

id                   组编号        组员姓名       组员信息1      组员信息2
-------------------- ---------- ---------- ---------- ----------
1                    001        张三         汉族         团员
1                    002        张三         汉族         团员

(2 行受影响)

------解决方案--------------------
select ID from 人员分组表 a where ID = 
(
select top 1 ID from 人员分组表 b where b.姓名='张三' and b.ID = a.ID
)
------解决方案--------------------
用NTILE有风险吧?万一有某组满足条件的有11人的话.用NTILE岂不查多了?
SELECT * FROM (
SELECT row_number() OVER(PARTITION BY [组编号] ORDER BY [组编号]) id,* FROM test WHERE [组员信息1]='汉族' AND [组员信息2]='团员' ......
)b
WHERE id=1