原表:
[ID][ID1] [fName] [fValue]
1 12 语文 80
1 12 英语 70
1 12 数学 50
1 13 数学 90
2 12 物理 85
2 12 语文 85
3 13 数学 92
3 12 物理 82
4 12 数学 60 合并后[ID][ID1] [Value]
1 12 语文(80)英语(70)
1 13 数学(90)
2 12 物理(85)语文(85)
3 13 数学(92)
3 12 物理(82)
4 12 数学(60) 因为上面表是我用临时表组成的再来合并的,我知道用函数可以实现,但是函数中好像不能使用临时表。具体需求就是把ID和ID1想同的行的列[fname]和[fValue]两列(这里可能有多列,同时列可以还有判断,比如说成绩不合格的不显示,像1 12 数学不合格,就是说合并列时有判断的)合并成一个列[Value],在下试过很多方法都无法实现,希望高手能给个脚本谢谢!还有个问题!我上面是在存储过程中实现的,如在程序的逻辑层来处理也可以,但是我的处理数据可能有几千到几万行,在逻辑层处理因为太慢了,因些我想这样,先把处理后的临时表数据放到物理表。这可就可以使用函数,但听说使用函数会把处理搞的很慢,请问是这样吗?
[ID][ID1] [fName] [fValue]
1 12 语文 80
1 12 英语 70
1 12 数学 50
1 13 数学 90
2 12 物理 85
2 12 语文 85
3 13 数学 92
3 12 物理 82
4 12 数学 60 合并后[ID][ID1] [Value]
1 12 语文(80)英语(70)
1 13 数学(90)
2 12 物理(85)语文(85)
3 13 数学(92)
3 12 物理(82)
4 12 数学(60) 因为上面表是我用临时表组成的再来合并的,我知道用函数可以实现,但是函数中好像不能使用临时表。具体需求就是把ID和ID1想同的行的列[fname]和[fValue]两列(这里可能有多列,同时列可以还有判断,比如说成绩不合格的不显示,像1 12 数学不合格,就是说合并列时有判断的)合并成一个列[Value],在下试过很多方法都无法实现,希望高手能给个脚本谢谢!还有个问题!我上面是在存储过程中实现的,如在程序的逻辑层来处理也可以,但是我的处理数据可能有几千到几万行,在逻辑层处理因为太慢了,因些我想这样,先把处理后的临时表数据放到物理表。这可就可以使用函数,但听说使用函数会把处理搞的很慢,请问是这样吗?
解决方案 »
- 求sql语句?
- 简单的,更新表多次的存储过程问题,立刻给分
- SQL自定义函数,无法调用?求解!
- 循环中导出文本文件的问题
- 445端口一关,客户端就无法连接到数据库,SQL数据库与445端口有何关系?
- 关于修改一个表的主键为标识列,使其初始值为1增长值也为1
- sql server中统计记录个数的存储过程如何写?!
- 请问在 sql server 2000里建的库怎样才能在 sql server 7.0里面用.
- 求救:nvarchar(或varchar)字段的值中含有n个换行,如何在取一批记录(多个字段)时将换行去掉并返回?真的急!急急!急急!急!(tcyun)
- T1、T2表该如何合并???
- 求SQL语句,用循环做
- 高手帮忙看看这个SQL语句那里错误
CREATE TABLE #(
ID int, [ID1] int, [fName] nvarchar(10), [fValue] int)
INSERT #
SELECT 1, 12, N'语文', 80 UNION ALL
SELECT 1, 12, N'英语', 70 UNION ALL
SELECT 1, 12, N'数学', 50 UNION ALL
SELECT 1, 13, N'数学', 90 UNION ALL
SELECT 2, 12, N'物理', 85 UNION ALL
SELECT 2, 12, N'语文', 85 UNION ALL
SELECT 3, 13, N'数学', 92 UNION ALL
SELECT 3, 12, N'物理', 82 UNION ALL
SELECT 4, 12, N'数学', 60 -- 合并查询
SELECT
A.*, Value = LTRIM(B.re)
FROM(
SELECT DISTINCT
ID, ID1
FROM #
)A
OUTER APPLY(
SELECT Re = (
SELECT c = RTRIM(fname) + QUOTENAME(fvalue, '()')
FROM # r
WHERE ID = A.ID
AND ID1 = A.ID1
AND Fvalue >= 60 -- 要求及格
FOR XML AUTO, TYPE
).query('<r>{for $i in /r/@c return(concat(" ",string($i)))}</r>').value('(/r)[1]','nvarchar(1000)')
)B
GODROP TABLE #-- 结果:
ID ID1 Value
1 12 语文(80) 英语(70)
1 13 数学(90)
2 12 物理(85) 语文(85)
3 12 物理(82)
3 13 数学(92)
4 12 数学(60)
oid = IDENTITY(int, 1, 1),
id, id1, value = CONVERT(nvarchar(4000), RTRIM(fname) + QUOTENAME(fvalue, '()'))
INTO #1
FROM #
WHERE [fValue] >= 60
ORDER BY id, id1
DECLARE @id int, @id1 int, @value nvarchar(4000)
UPDATE A SET
@value = CASE WHEN @id = ID AND @id1 = ID1 THEN @value + N' ' + value ELSE value END,
value = @value,
@id = ID, @id1 = ID1
FROM #1 A
SELECT id, id1, value FROM #1 A
WHERE NOT EXISTS(
SELECT * FROM #1
WHERE ID = A.ID AND ID1 = A.ID1 AND oid > A.oid)
DROP TABLE #1
不过现在需求发生了改变:实现这样
id titleName todoID itemID value1 value2 value3
7496 姓名 35702 153853 Jack NULL NULL
7500 工作满意度 35702 15265 满意 NULL NULL
7500 工作满意度 35702 15266 非常满意 NULL NULL
7500 工作满意度 35702 15267 不满意 NULL NULL
7503 培训 35702 NULL NULL 它必另填 NULL
7503 培训 35702 15272 有 NULL NULL
7503 培训 35702 15276 其它 NULL NULL
7504 表现 35702 15279 不好 NULL 1
7504 表现 35702 15278 非常好 NULL 2
7504 表现 35702 15277 好 NULL 37496 姓名 35703 153853 peter NULL NULL
7500 工作满意度 35703 15265 非常满意 NULL NULL
7500 工作满意度 35703 15266 满意 NULL NULL
7500 工作满意度 35703 15267 不满意 NULL NULL
7503 培训 35703 NULL NULL 它必另填 NULL
7503 培训 35703 15272 有 NULL NULL
7503 培训 35703 15276 其它 NULL NULL
7504 表现 35703 15279 不好 NULL 1
7504 表现 35703 15278 非常好 NULL 2
7504 表现 35703 15277 好 NULL 3合并后的表单
id titleName todoID value1
7496 姓名 35702 Jack
7500 工作满意度 35702 (1).满意 (2).非常满意 (3).不满意
7503 培训 35702 (1).有 (2).一点点 (3).其它 它必另填
7504 表现 35702 (1).不好 (2).非常好 (3).好7496 姓名 35702 Jack
7500 工作满意度 35702 (1).满意 (2).非常满意 (3).不满意
7503 培训 35702 (1).有 (2).一点点 (3).其它 它必另填
7504 表现 35702 (1).不好 (2).非常好 (3).好小弟不才,不能举一反三,我打算这样实现,id,和todoID相同的行合并,同时当value3不为NULL时就以[value3]列排序,像[表现] 行一样,如果为null,就以itemID排序,你[工作满意度]列那样。但[培训]中有一行的itemID为空时就把value2的值放到以[itemID]列排序的最后,如(3).其它 它必另填,如老大能帮小弟解决这个问题再加50分。不过不知怎么加分吗?
id titleName todoID value1
7496 姓名 35702 Jack
7500 工作满意度 35702 (1).满意 (2).非常满意 (3).不满意
7503 培训 35702 (1).有 (2).一点点 (3).其它 它必另填
7504 表现 35702 (1).不好 (2).非常好 (3).好7496 姓名 35703 Jack
7500 工作满意度 35703 (1).满意 (2).非常满意 (3).不满意
7503 培训 35703 (1).有 (2).一点点 (3).其它 它必另填
7504 表现 35703 (1).不好 (2).非常好 (3).好