1

Это проблема Таблица:Q: матч строк и вставка возвращаемого значения в SQL (Комплексное состояние)

 UNIQUE ID    NAME   TYPE  PRICE PAYMENT METHOD  Reference 

    hbg5-5rdw-6ts   Bagui  RECEIVED 150  MANUAL   CREDIT CARD  
    asd4e-4rs-5tg   Cams  RECEIVED 100  CASH    181088 
    fg6gh-rfd4-tgv   Cams  TRANSFER 100  CASH    181088 
    a3accf-wrf-aw   Chels  RECEIVED 700  MANUAL   COD 
    1sder-5tg7-gcd   Chels  SUCCESS  500  CHECK  
    asde-1d-sedc   Chels  SUCCESS  500  CHECK   1sder-5tgs7-gcd5 Failed 
    ased-asd-sedf   Duzy  RECEIVED 250  DEBIT   181077 
    5rt4w-4sd-zsd   Duzy  TRANSFER 250  DEBIT   181077 
    4er-445ff-thc   Jose  RECEIVED 300  CASH    157075 
    4wer-45ff-4hc   Jose  TRANSFER 300  CASH    157075 
    4sde-12d-sedc   Lane  SUCCESS  500  MANUAL   CREDIT CARD  
    3accf-erf-aec5   Marjo  TRANSFER 100  WIRE    181877 
    cbg44-fgb-6s   Marjo  RECEIVED 100  WIRE    181877 
    wer-445ff-4thc   Marjo  TRANSFER 100  WIRE    181877 
    3hbg5-5rd-6tsg   Raj   SUCCESS  300  COD  as1sder-5tgs7-gcd5 failed 
    as1er-tgs7-gd5   Raj   SUCCESS  300  COD  

Выходной сигнал/РЕЗУЛЬТАТ таблица должна возвращать Как это

UNIQUE ID NAME TYPE  PRICE PMETHOD  Reference  Comment 
hbg5-5rdw-6ts Bagui RECEIVED 150 CREDITCARD CREDIT CARD  CREDIT CARD 
asd4e-4rs-5tg Cams RECEIVED 100 CASH   181088   TRANSFER 
fg6gh-rfd4-tgv Cams TRANSFER 100 CASH   181088   RECEIVED 
a3accf-wrf-aw Chels RECEIVED 700 COD   COD    COD 
1sder-5tg7-gcd Chels SUCCESS  500 MANUAL       Failed Delivery 
asde-1d-sedc Chels SUCCESS  500 MANUAL  1sder Wrong ADD Failed Delivery 
ased-asd-sedf Duzy RECEIVED 250 DEBIT   181077   TRANSFER 
5rt4w-4sd-zsd Duzy TRANSFER 250 DEBIT   181077   RECEIVED 
4er-445ff-thc Jose RECEIVED 300 CASH   157075   TRANSFER 
4wer-45ff-4hc Jose TRANSFER 300 CASH   157075   RECEIVED 
4sde-12d-sedc Lane SUCCESS  500 MANUAL  CREDIT CARD  CREDIT CARD 
3accf-erf-aec5 Marjo TRANSFER 100 WIRE   181877   CHECK 
cbg44-fgb-6s Marjo RECEIVED 100 WIRE   181877   CHECK 
wer-445ff-4thc Marjo TRANSFER 100 WIRE   181877   CHECK 
3hbg5-5rd-6tsg Raj  SUCCESS  300 MANUAL  as1sder-5tgs7 Failed Delivery 
as1er-tgs7-gd5 Raj  SUCCESS  300 MANUAL       Failed Delivery 

Что следует учитывать: Комментирование тегов основано на REFE Renče Есть 3 условия для справки: NUMERIC: 181088,181877 ХАРАКТЕР: COD, кредитная карточка TEXT STRING: 1sder-5tgs7.

ЕСЛИ ЧИСЛОВОЙ: СПИЧКА Числовой REFERENCE и этикетки COMMENT с TYPE соответствующей пары. EG: Прием или передача IF NUMERIC более чем 2, как 181877 комментарий должен быть проверить

IF ХАРАКТЕР: Копирование символов REFERENCE в COMMENT затем изменить Payment Method согласно COMMENT

IF (ПРИСУТСТВУЕТ УСПЕХА TYPE ТОЛЬКО) TEXT STRING: Найти match текстовую строку и ярлык Сбой доставки для COMMENT и Руководство для PAYMENT METHOD IF BLANKS смысл нет описание как есть.

* Есть тысячи транзакций.

Заказ должен быть по ссылке: ЧИСЛЕННЫЙ, ХАРАКТЕР СТРОКИМ.

Другие советы от другого пользователя: принять

Вы можете использовать общие выражения таблицы, чтобы сломать эту проблему, которая может помочь с сохранением кода.

Я не использовал лагов/свинец, потому что у вас есть только два ряда в паре, поэтому нумерация строк и соединение таблицы для себя стали более быстрыми и легкими в использовании.

Большое вам спасибо. SQL NewBie

+0

Не понимаю ... Почему «КРЕДИТНАЯ КАРТА» изменилась на «ДЕБЕТ КАРТОЧКУ» в первой строке? Как вы начинаете писать «TRANSFER», соответственно. «ПОЛУЧЕНА» во 2-й и 3-й строках? Знаете ли вы, что таблица не имеет никакого неявного порядка? Есть ли какая-либо логика в зависимости от того, что будет первым/следующим? Если да: как бы вы это отсортировали? – Shnugo

+0

Ссылка НОМЕРА, ХАРАКТЕРЫ и строки следующим образом. Пожалуйста, не обращайте внимания на первую строку. Опечатка. Это должна быть кредитная карта. – Chels

+0

Еще не понятно ... Посмотрите на свою вторую и третью строки. Если порядок имеет значение (по крайней мере, вы думаете о 'LAG/LEAD'): почему 2-й не третий и наоборот? Сортировка по 'REFERENCE' недостаточна, они равны ... – Shnugo

ответ

1

Эта конструкция awfull ...

Следующий код даст вам направление. Получение измененных значений для других столбцов, тогда COMMENT будет легко, если вы сделаете это так же, как только еще один большой «CASE WHEN». Но вы действительно должны попытаться переосмыслить дизайн, если это под вашим контролем ...

DECLARE @tbl TABLE(UNIQUE_ID VARCHAR(100),NAME VARCHAR(100),TYPE VARCHAR(100),PRICE DECIMAL(14,4),PAYMENT_METHOD VARCHAR(100),Reference VARCHAR(100)); 
INSERT INTO @tbl VALUES 
('hbg5-5rdw-6ts','Bagui','RECEIVED',150,'MANUAL','CREDIT CARD')  
,('asd4e-4rs-5tg','Cams','RECEIVED',100,'CASH','181088') 
,('fg6gh-rfd4-tgv','Cams','TRANSFER',100,'CASH','181088') 
,('a3accf-wrf-aw','Chels','RECEIVED',700,'MANUAL','COD') 
,('1sder-5tg7-gcd','Chels','SUCCESS',500,'CHECK','')  
,('asde-1d-sedc','Chels','SUCCESS',500,'CHECK','1sder-5tgs7-gcd5 Failed') 
,('ased-asd-sedf','Duzy','RECEIVED',250,'DEBIT','181077') 
,('5rt4w-4sd-zsd','Duzy','TRANSFER',250,'DEBIT','181077') 
,('4er-445ff-thc','Jose','RECEIVED',300,'CASH','157075') 
,('4wer-45ff-4hc','Jose','TRANSFER',300,'CASH','157075') 
,('4sde-12d-sedc','Lane','SUCCESS',500,'MANUAL','CREDIT CARD')  
,('3accf-erf-aec5','Marjo','TRANSFER',100,'WIRE','181877') 
,('cbg44-fgb-6s','Marjo','RECEIVED',100,'WIRE','181877') 
,('wer-445ff-4thc','Marjo','TRANSFER',100,'WIRE','181877') 
,('3hbg5-5rd-6tsg','Raj','SUCCESS',300,'COD','as1sder-5tgs7-gcd5 failed') 
,('as1er-tgs7-gd5','Raj','SUCCESS',300,'COD','');  

--The КТР проверит некоторые вещи первые

WITH checkIt AS 
(
    SELECT * 
      ,COUNT(*) OVER(PARTITION BY t1.Name,t1.Reference) AS PartCount 
      ,ROW_NUMBER() OVER(PARTITION BY t1.Name,t1.Reference ORDER BY (SELECT NULL)) AS RowInx 
      ,CASE WHEN ISNUMERIC(Reference)=1 THEN 'num' ELSE CASE WHEN ISNULL(Reference,'') ='' THEN 'empty' ELSE 'str' END END AS typ 
    FROM @tbl AS t1 
) 

--the основной выбор будет использовать знаки КТР для переключения на правильную ветку вложенной CASE WHEN -hierarchy

SELECT * 
     ,CASE WHEN c1.typ='empty' THEN 'Failed Delivery' 
      WHEN c1.PartCount>2 THEN 'CHECK' 
      WHEN c1.typ='num' AND c1.RowInx=2 THEN (SELECT x.TYPE 
                 FROM checkIt AS x 
                 WHERE x.NAME=c1.NAME 
                 AND x.Reference=c1.Reference 
                 AND x.RowInx=1) 
      WHEN c1.typ='num' AND c1.RowInx=1 THEN (SELECT x.TYPE 
                 FROM checkIt AS x 
                 WHERE x.NAME=c1.NAME 
                 AND x.Reference=c1.Reference 
                 AND x.RowInx=2) 
      WHEN c1.typ='str' THEN CASE WHEN CHARINDEX(' failed',c1.Reference)>0 THEN 'Failed Delivery' 
            ELSE c1.Reference END 
     ELSE 'not handled' 
    END AS Comment 
FROM checkIt AS c1 
+0

Спасибо, schnugo. Я попытаюсь включить ваш совет, хотя файл формируется так ужасно :( – Chels

+0

Это не работает. Даже пробелы были помечены как неудачные – Chels

+1

@Chels Что означает * это не работает * означает? В вашем примере выше строк без ссылка отмечена как неудачная ... Я не знаю вашу фактическую логику в деталях. Просто добавьте все случаи в «CASE WHEN». Первое условие: заполненные победы. – Shnugo

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

  • Нет связанных вопросов^_^