2015-02-05 4 views
-2

У меня есть таблица содержит данные ниже:Процедура SQL (Sybase базы данных сервера Advantage)

EMPCODE PAYCODE AMOUNT 
------------------------ 
001  A  100 
001  B  200 
002  A  120 
002  C   80 
003  B   50 
003  D   20 

Все PAYCODE в таблице на данный момент являются А, В, С, D.

Однако другие EMPCODE с другие новые PAYCODE, такие как E или F, могут быть добавлены позже.

  • EMPCODE 001 имеет PAYCODE A и B (у него нет PAYCODE C и D).
  • EMPCODE 002 имеет PAYCODE A и C (у него нет PAYCODE B и D).
  • EMPCODE 003 имеет PAYCODE B и D (у него нет PAYCODE A и C).

Я хочу создать простую хранимую процедуру/SQL, которая может добавлять фиктивные записи для каждого EMPCODE для PAYCODE, которые у них нет.

Мой ожидаемый результат, как показано ниже:

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-хранимая процедура для достижения этой цели?

Цените ответ.

ответ

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 
+0

Спасибо, Кумар, Это работа.Но не могли бы вы объяснить: SELECT * FROM (SELECT EMPCODE FROM RPTRX GROUP BY EMPCODE) AS A, (SELECT PAYCODE FROM RPTRX GROUP BY PAYCODE) AS B – btan

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 
    ) 

Sample SQL Fiddle

Edit: в Sybase ASE не поддерживает явного cross join вы можете использовать неквалифицированный неявное присоединиться с тем же эффектом, делая from TableA, TableB, который возвращает декартово произведение строк. См. Это Wikipedia article для объяснения.

+0

привет jpw, спасибо за ответ, но мой движок базы данных (Sybase Advantage Сервер базы данных 8.1) не распознают CROSS JOIN – btan

+0

@btan О, я не знал. На самом деле вы можете удалить ключевое слово «cross join» для достижения такого же эффекта. Я обновил свой ответ, чтобы отразить это. – jpw

Смежные вопросы