【在线等。。。】求一个SQL语句

wxylvmnn 2009-08-28 07:48:58
前提,我这个是SQL 2000



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


难死我了,,,终于说完了,,,不知道大家是否能看懂。。。。
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxylvmnn 2009-08-28
  • 打赏
  • 举报
回复
啥也不说了,结贴!
minshao 2009-08-28
  • 打赏
  • 举报
回复
这个东西很花时间
guguda2008 2009-08-28
  • 打赏
  • 举报
回复
6L错了,这个才是对的


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
*/

guguda2008 2009-08-28
  • 打赏
  • 举报
回复

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
*/

liangCK 2009-08-28
  • 打赏
  • 举报
回复
-------------------------------------
-- 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 行受影响)
*/



这样?
guguda2008 2009-08-28
  • 打赏
  • 举报
回复
看明白了。。
--小F-- 2009-08-28
  • 打赏
  • 举报
回复
看晕了 总之就case when ...
guguda2008 2009-08-28
  • 打赏
  • 举报
回复
③、跟 FA,FB组合 对应的No的前4位相同的,并且 XingFu=‘形’的数据,可能存在n条,1条,0条的可能。

如果取得n条,则取No最小的 ,那个 形 对应的CD1的值,
LZ你的结果里根本没有 形 嘛
guguda2008 2009-08-28
  • 打赏
  • 举报
回复
看不懂。。。。太绕了

34,590

社区成员

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

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