表a:
id qty pro code
1 15 书 001
2 15 碟 002
表b:
id qty pro code
1 2 碟 002
2 4 书 001
3 3 碟 002
4 3 书 001
5 1 书/碟 001/002
在上面UPDATE表A的qty时,根据code是否包含'/',如果包含的话两种产品001与002同时减1,不包含的话直接减掉b.qty,请问这SQL要怎样写?
如上表,运算后表A的结果为:
id qty pro code
1 7 书 001
2 9 碟 002
id qty pro code
1 15 书 001
2 15 碟 002
表b:
id qty pro code
1 2 碟 002
2 4 书 001
3 3 碟 002
4 3 书 001
5 1 书/碟 001/002
在上面UPDATE表A的qty时,根据code是否包含'/',如果包含的话两种产品001与002同时减1,不包含的话直接减掉b.qty,请问这SQL要怎样写?
如上表,运算后表A的结果为:
id qty pro code
1 7 书 001
2 9 碟 002
标题:分拆列值1
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
描述有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
*/--1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)BDROP TABLE tb/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc(5 行受影响)
*/
insert into a values(1 , 15 , '书' , '001')
insert into a values(2 , 15 , '碟' , '002')
create table b(id int, qty int,pro varchar(10) ,code varchar(10))
insert into b values(1 , 2 , '碟' , '002')
insert into b values(2 , 4 , '书' , '001')
insert into b values(3 , 3 , '碟' , '002')
insert into b values(4 , 3 , '书' , '001')
insert into b values(5 , 1 , '书/碟', '001/002')
goupdate a set qty = qty - isnull((select sum(qty) from b where charindex('/'+a.code+'/','/'+b.code+'/') >0 ) , 0) from aselect * from adrop table a, b/*
id qty pro code
----------- ----------- ---------- ----------
1 7 书 001
2 9 碟 002(所影响的行数为 2 行)
*/
update a set a.qty = (select sum(b.qty) from b where b.code like '%a.code%')
INSERT @A
SELECT 1 , 15 , '书', '001' UNION ALL
SELECT 2 , 15 , '碟', '002' DECLARE @B TABLE (id INT, qty INT,pro VARCHAR(10), code VARCHAR(10))
INSERT @B
SELECT 1 , 2 , '碟' , '002' UNION ALL
SELECT 2 , 4 , '书' , '001' UNION ALL
SELECT 3 , 3 , '碟' , '002' UNION ALL
SELECT 4 , 3 , '书' , '001' UNION ALL
SELECT 5 , 1 , '书/碟', '001/002' UPDATE @A SET QTY=A.QTY-(SELECT SUM(B.QTY) FROM @B B WHERE CHARINDEX(A.PRO,B.PRO)>0) FROM @A A--SELECT *,A.QTY-(SELECT SUM(B.QTY) FROM @B B WHERE CHARINDEX(A.PRO,B.PRO)>0) FROM @A ASELECT * FROM @A
(所影响的行数为 2 行)
(所影响的行数为 5 行)
(所影响的行数为 2 行)id qty pro code
----------- ----------- ---------- ----------
1 7 书 001
2 9 碟 002(所影响的行数为 2 行)