我的表包含以下数据:
EMPCODE PAYCODE AMOUNT
------------------------
001 A 100
001 B 200
002 A 120
002 C 80
003 B 50
003 D 20
目前表中的所有PAYCODE都是A,B,C,D。
但是,其他EMPCODE与其他新的PAYCODE(如E或F)可能会在稍后添加。
我想创建一个简单的存储过程/ SQL,它可以为PAYCODE的每个EMPCODE添加它们不拥有的虚拟记录。
我的预期结果如下:
EMPCODE PAYCODE AMOUNT
------------------------
001 A 100
001 B 200
001 C 0
001 D 0
002 A 120
002 B 0
002 C 80
002 D 0
003 A 0
003 B 50
003 C 0
003 D 20
我可以通过编码实现这一目标,但我需要通过存储过程来实现。
是否有任何SQL存储过程来实现此目的?
欣赏答案。
答案 0 :(得分:1)
使用Join
获取结果。的 SQLFiddle 强>
SELECT C.EMPCODE, C.PAYCODE, ISNULL(D.AMOUNT, 0) AS AMOUNT FROM
(
SELECT * FROM
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A,
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
) AS C
LEFT JOIN Test AS D
ON C.EMPCODE=D.EMPCODE AND C.PAYCODE = D.PAYCODE
<强>更新强>
1)从表中获取distinct EMPCODE
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A
2)从表中获取distinct PAYCODE
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
3)获取每个PAYCODE
的所有Empcode
值。
SELECT * FROM
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A,
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
答案 1 :(得分:0)
您可以通过在子查询中使用empcode
生成paycode
和cross join
的所有组合来执行此操作,然后将其用作左连接的派生表。要不插入现有行,您应使用相关的not exists
谓词排除它们。写成存储过程可能如下所示:
create proc insert_missing_values as
insert your_table (empcode, paycode, amount)
select distinct codes.empcode, codes.paycode, isnull(your_table.amount, 0) amount
from (
select t1.empcode, t2.paycode
from your_table t1, your_table t2
group by t1.empcode, t2.paycode
) codes
left join your_table on
codes.empcode = your_table.empcode
and
codes.paycode = your_table.paycode
where not exists (
select 1 from your_table
where codes.empcode = your_table.empcode and codes.paycode = your_table.paycode
)
编辑:由于Sybase ASE不支持显式cross join
,您可以通过执行返回行的笛卡尔积的from TableA, TableB
来使用具有相同效果的非限定隐式连接。有关说明,请参阅此Wikipedia article。