SQL для генерации последовательности для набора столбцов в зависимости от выбранных критериев - PullRequest
0 голосов
/ 22 июля 2011

У меня есть данные таблицы записей в журнале счетов, например:

TxnID   VchNo    SeqNo      Date    AccountName                TxnAmt   CrDr
103931  0        0     1-Apr-2011   ADVERTISEMENT                3600   D
103932  0        0     1-Apr-2011   MAYA OUTDOOR ADVERTISING     3600   C
103933  0        0     1-Apr-2011   NILESH BRANKS              850500   D
103934  0        0     1-Apr-2011   T.D.S ON CONTRACT A/C       45600   C
103935  0        0     1-Apr-2011   CHEQUE A/C                 185000   C
103936  0        0     1-Apr-2011   PROFESSIONAL CHARGES       619900   C
103937  0        0     1-Apr-2011   ADVERTISEMENT  (HOARDING)   77210   C
103938  0        0     1-Apr-2011   A111 COMMUNICATIONS         77210   D
103939  0        0     1-Apr-2011   SALARY A/C                  55500   D
103940  0        0     1-Apr-2011   T JOHN                      25000   C
103941  0        0     1-Apr-2011   PHILIPS                     30500   C

TxnAmt может быть Credit (C) или Debit (D).Обратите внимание, что для TxnID 103931 и 103932 дебет и кредит аннулируются.Для этих пар я хочу создать уникальный VchNo (номер ваучера), скажем, 101 с последовательностями 1 и 2 соответственно.
Для TxnID 103933 существует дебетовая сумма (850500), которая равна сумме кредита TxnID 103934, 103935и 103936 (45600 + 185000 + 619900).Я хочу установить VchNo как 102 для этих транзакций с последовательностью № 1, 2, 3, 4 соответственно, как показано в следующем наборе результатов:

TxnID   VchNo    SeqNo      Date    AccountName                TxnAmt   CrDr
103931  101      1     1-Apr-2011   ADVERTISEMENT                3600   D
103932  101      2     1-Apr-2011   MAYA OUTDOOR ADVERTISING     3600   C
103933  102      1     1-Apr-2011   NILESH BRANKS              850500   D
103934  102      2     1-Apr-2011   T.D.S ON CONTRACT A/C       45600   C
103935  102      3     1-Apr-2011   CHEQUE A/C                 185000   C
103936  102      4     1-Apr-2011   PROFESSIONAL CHARGES       619900   C
103937  103      1     1-Apr-2011   ADVERTISEMENT  (HOARDING)   77210   C
103938  103      2     1-Apr-2011   A111 COMMUNICATIONS         77210   D
103939  104      1     1-Apr-2011   SALARY A/C                  55500   D
103940  104      2     1-Apr-2011   T JOHN                      25000   C
103941  104      3     1-Apr-2011   PHILIPS                     30500   C

Предположим, что последовательность первого ваучера не будет 101, я хочуобновить VchNo и SeqNo, как показано выше.Пожалуйста, помогите мне достичь этого.

1 Ответ

2 голосов
/ 22 июля 2011

Вы можете использовать CTE (Common Table Expression) с предложениями ROW_NUMBER и PARTITION BY:

;WITH YourData AS
(SELECT
    (list of columns),
    ROW_NUMBER() OVER(PARTITION BY VchNo ORDER BY TxnID DESC) AS 'SeqNo')
 FROM
    dbo.YourTable
 WHERE (condition)
)
SELECT * 
FROM YourData

По сути, CTE разделяет ваши данные на VchNo, то есть каждый VchNo определяет "разделение" данных. Функция ROW_NUMBER будет последовательно нумеровать все строки, начиная с каждой в каждом разделе.

Просто перечитайте свой вопрос, и, похоже, у вас нет значения VchNo для начала ..... Я не совсем понимаю, как вы хотите создать VchNo - они должны основываться по некоторым критериям тоже - и я не вижу в ваших исходных данных ничего, что могло бы «скрепить» эти значения ...

Но вы определенно можете создать две ROW_NUMBER функции внутри одного CTE, или вам может потребоваться сделать первый CTE для определения VchNo и второй для определения SeqNo на основе этого VchNo из первого CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...