34,590
社区成员
发帖
与我相关
我的任务
分享
tableA的表内容如下,FA,FB,No是主键。
KEY KEY KEY
FA FB No XingFu CD1
1 2 01019BC 形 A
1 2 01010BC 形 B
1 2 010100A 副 C
1 2 010100B 副 D
1 2 010100C 副 E
2 2 03028BC 形 F
2 2 030200A 副 G
2 2 030200B 副 H
3 3 030200B 副 H
处理的逻辑要求是,
①、取得表tableA中 FA,FB 为组合的,并且XingFu=‘副’ 的数据。
②、No列 的已知信息是,相同的 FA,FB组合,并且XingFu=‘副’ 的数据,对应数据的前4位肯定是相同的,
比如,上面的3~5条数据,对应的No的前4位都是0101。
③、跟 FA,FB组合 对应的No的前4位相同的,并且 XingFu=‘形’的数据,可能存在n条,1条,0条的可能。
如果取得n条,则取No最小的 ,那个 形 对应的CD1的值,
<B>比如</B>,上面的3~5条数据,取得的CD1是B。
如果取得1条,就直接赋值
<B>比如</B>,上面的6~7条数据,取得的CD1是F。
如果取得0条,就直接赋值成X
<B>比如</B>,上面的最后一条条数据,没有对应的"形",所以取得的CD1是X。
总之,希望得到的数据是:
FA FB No XingFu CD1
1 2 010100A 副 B
1 2 010100B 副 B
1 2 010100C 副 B
2 2 030200A 副 F
2 2 030200B 副 F
3 3 030200B 副 X
难死我了,,,终于说完了,,,不知道大家是否能看懂。。。。
IF OBJECT_ID('tableA') IS NOT NULL DROP TABLE TABLEA
GO
CREATE TABLE TABLEA(
FA INT,
FB INT,
[NO] VARCHAR(50),
XIAOFU VARCHAR(10),
CD1 VARCHAR(10)
)
INSERT INTO TABLEA
SELECT 1, 2, '01019BC','形','A'
UNION ALL SELECT 1, 2, '01010BC','形','B'
UNION ALL SELECT 1, 2, '010100A','副','C'
UNION ALL SELECT 1, 2, '010100B','副','D'
UNION ALL SELECT 1, 2, '010100C','副','E'
UNION ALL SELECT 2, 2, '03028BC','形','F'
UNION ALL SELECT 2, 2, '030200A','副','G'
UNION ALL SELECT 2, 2, '030200B','副','H'
UNION ALL SELECT 3, 3, '030200B','副','H'
SELECT A.FA,A.FB,A.NO,A.XIAOFU,ISNULL(B.[CD1],'X') 'CD1'
FROM TABLEA A
LEFT JOIN TABLEA B ON A.FA=B.FA AND A.FB=B.FB AND B.XIAOFU='形'
AND NOT EXISTS(SELECT 1 FROM TABLEA C WHERE C.FA=B.FA AND C.FB=B.FB AND C.XIAOFU=B.XIAOFU AND C.[NO]<B.[NO])
WHERE A.XIAOFU='副'
/*
1 2 010100A 副 B
1 2 010100B 副 B
1 2 010100C 副 B
2 2 030200A 副 F
2 2 030200B 副 F
3 3 030200B 副 X
*/
IF OBJECT_ID('tableA') IS NOT NULL DROP TABLE TABLEA
GO
CREATE TABLE TABLEA(
FA INT,
FB INT,
[NO] VARCHAR(50),
XIAOFU VARCHAR(10),
CD1 VARCHAR(10)
)
INSERT INTO TABLEA
SELECT 1, 2, '01019BC','形','A'
UNION ALL SELECT 1, 2, '01010BC','形','B'
UNION ALL SELECT 1, 2, '010100A','副','C'
UNION ALL SELECT 1, 2, '010100B','副','D'
UNION ALL SELECT 1, 2, '010100C','副','E'
UNION ALL SELECT 2, 2, '03028BC','形','F'
UNION ALL SELECT 2, 2, '030200A','副','G'
UNION ALL SELECT 2, 2, '030200B','副','H'
UNION ALL SELECT 3, 3, '030200B','副','H'
SELECT A.FA,A.FB,A.NO,A.XIAOFU,ISNULL(MAX(B.[CD1]),'X') 'CD1'
FROM TABLEA A
LEFT JOIN TABLEA B ON A.FA=B.FA AND A.FB=B.FB AND B.XIAOFU='形'
WHERE A.XIAOFU='副'
GROUP BY A.FA,A.FB,A.NO,A.XIAOFU,A.CD1
/*
1 2 010100A 副 B
1 2 010100B 副 B
1 2 010100C 副 B
2 2 030200A 副 F
2 2 030200B 副 F
3 3 030200B 副 X
*/
-------------------------------------
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-28 20:06:29
-------------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (FA INT,FB INT,No VARCHAR(7),XingFu VARCHAR(2),CD1 VARCHAR(1))
INSERT INTO @T
SELECT 1,2,'01019BC','形','A' UNION ALL
SELECT 1,2,'01010BC','形','B' UNION ALL
SELECT 1,2,'010100A','副','C' UNION ALL
SELECT 1,2,'010100B','副','D' UNION ALL
SELECT 1,2,'010100C','副','E' UNION ALL
SELECT 2,2,'03028BC','形','F' UNION ALL
SELECT 2,2,'030200A','副','G' UNION ALL
SELECT 2,2,'030200B','副','H' UNION ALL
SELECT 3,3,'030200B','副','H'
--SQL查询如下:
SELECT
FA,FB,No,XingFu,
CD1 = CASE WHEN EXISTS(SELECT * FROM @T
WHERE FA = A.FA AND FB = A.FB
AND LEFT(No,4) = LEFT(A.No,4)
AND XingFu = '形')
THEN (SELECT TOP 1 CD1 FROM @T
WHERE FA = A.FA AND FB = A.FB
AND LEFT(No,4) = LEFT(A.No,4)
AND XingFu = '形'
ORDER BY No
)
ELSE 'X' END
FROM @T AS A
WHERE XingFu = '副'
/*
FA FB No XingFu CD1
----------- ----------- ------- ------ ----
1 2 010100A 副 B
1 2 010100B 副 B
1 2 010100C 副 B
2 2 030200A 副 F
2 2 030200B 副 F
3 3 030200B 副 X
(6 行受影响)
*/