SQL*_*L_M 5 t-sql sql-server sql-server-2008
我遇到了一个令我生气的奇怪问题.我有一张桌子,基本上归结为:
CREATE TABLE #Sample (ColA VARCHAR (20), ColB VARCHAR (20), ColC VARCHAR (20), ColD VARCHAR (10), ColE VARCHAR (10) )
INSERT INTO #Sample VALUES ('6250', '1001', '12AA', '12AA', ''),
('6250', '1002', '12AA', '12AA', ''),
('6251', '1003', '12BB', '12BB', 'A'),
('6252', '1004', '12CC', '12CC', '')
Run Code Online (Sandbox Code Playgroud)
我收到了装运单的规格.对于COLB的每个值,我必须重复下面的步骤,以使得创建一个输出列.前两行是文本,第二行和第三行是前缀+来自列B和C的值.作为奖励,只有当ColE被填充时,我们必须选择前缀加上ColE.
这可能听起来令人困惑,所以我将添加所需的输出:
'A1 Text'
'A2 Text'
'ZZ62501001' -- ZZ prefix + ColA + ColB
'ZZ12AA' -- ZZ prefix + ColC
'A1 Text'
'A2 Text'
'ZZ62501002' -- ZZ prefix + ColA + ColB
'ZZ12AA' -- ZZ prefix + ColC
'A1 Text'
'A2 Text'
'ZZ62511003' -- ZZ prefix + ColA + ColB
'ZZA' -- ZZ prefix + ColE (notice that this is only shown when ColE is filled)
'ZZ12BB' -- ZZ prefix + ColC
'A1 Text'
'A2 Text'
'ZZ62521004' -- ZZ prefix + ColA + ColB
'ZZ12CC' -- ZZ prefix + ColC
Run Code Online (Sandbox Code Playgroud)
这个设置有很多错误,但我对此事没有影响力.所以我坚持手头的问题.
我的尝试是首先创建一个"常规"输出表,然后尝试创建一个包含一列的新表.
我的代码尝试,这是非常差的,但我会包括它:
CREATE TABLE #Output ( ColA VARCHAR (100),
ColB VARCHAR (100),
ColC VARCHAR (100),
ColD VARCHAR (100),
ColE VARCHAR (100) )
DECLARE @Counter INT
SET @Counter = 1
WHILE @Counter < ( SELECT MAX (RowNumb) FROM #Sample )
BEGIN
INSERT INTO #Output
SELECT 'A1 Text',
'A2 Text',
'ZZ' + ColA + ColB, -- ZZ prefix + ColA + ColB
'ZZ' + ColC,
'ZZ' + ColE
FROM #Sample
SET @Counter = @Counter + 1
END
SELECT * FROM #Output
Run Code Online (Sandbox Code Playgroud)
如果有人能解决这个奇怪的问题并创造出所需的输出,我会非常感激.
性能在这里不是一个真正的问题,处理成千上万的行,因此游标或循环不是问题.
使用 cross apply 让你每行构建多行:
declare @Sample table (ColA VARCHAR (20), ColB VARCHAR (20), ColC VARCHAR (20), ColD VARCHAR (10), ColE VARCHAR (10) )
INSERT INTO @Sample VALUES ('6250', '1001', '12AA', '12AA', ''),
('6250', '1002', '12AA', '12AA', ''),
('6251', '1003', '12BB', '12BB', 'A'),
('6252', '1004', '12CC', '12CC', '')
select a.results
from @Sample
cross apply (values ('A1 Text')
,('A2 Text')
,('ZZ' + ColA + ColB)
,('ZZ' + ColC)
,('ZZ' + ColE)
) a(results)
where a.results != 'ZZ'
Run Code Online (Sandbox Code Playgroud)
结果:
results
A1 Text
A2 Text
ZZ62501001
ZZ12AA
A1 Text
A2 Text
ZZ62501002
ZZ12AA
A1 Text
A2 Text
ZZ62511003
ZZ12BB
A1 Text
A2 Text
ZZ62521004
ZZ12CC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |