Выберите Уникальные записи из таблицы - PullRequest
0 голосов
/ 28 июня 2019

У меня есть таблица sql с многозначными полями (Депозиты, Tax1 и tax2), как показано ниже:

ID   Account_Number    Plan       Deposits       Tax1            Tax2

10   123456            PRINC10      4;4       4256.45;1567.45  4256.45;1567.45


11   123456            KrINC11      4;4       4256.45;1567.45  4256.45;1567.45 

Я отделил многозначные поля с помощью табличной функции DelimiterSplit8K из SQL Servercentral.com.

Код, который я использовал для разделения многозначных полей для разделения строк, приведен ниже:

 Select [ID], [account_number], [Plan], [Deposits], [Tax1], [Tax2]
 From MVTable
 Cross apply dbo.DelimitedSplit8K(MVTable.Deposits, ';') as Depositlist
 Cross apply dbo.DelimitedSplit8K(MVTable.Tax1, ';') as Tax1List
 Cross apply dbo.DelimitedSplit8K(MVTable.Tax2, ';') as Tax2List
  `enter code here`Where DepositList.Itemnumber = Tax1list.itemnumber
  and Depositlist.itemnumber = Tax2list.itemnumber

Но полученные данные содержат несколько дубликатов

ID   account_number     Plan     Deposits   Tax1         Tax2 

10   123456             PRINC10    4        4256.45     4256.45

10   123456             PRINC10    4        1567.45     1567.45

11   123456             KrINC11    4        4256.45     4256.45

11   123456             KrINC11    4        1567.45     1567.45

Требуемый результат долженкак показано ниже, нам нужно только одно поле плана для каждого поля номера счета / идентификатора и полей Tax1 и Tax2 соответственно.

ID   account_number     Plan     Deposits   Tax1         Tax2 

10   123456             PRINC10    4        4256.45     4256.45

11   123456             KrINC11    4        1567.45     1567.45

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Я бы порекомендовал другой способ разделения значений:

with cte as (
      select id, account_number, plan,
             convert(varchar(max), left(deposits, charindex(';', deposits + ';') - 1)) as deposit,
             convert(varchar(max), left(tax2, charindex(';', tax2 + ';') - 1)) as tax1,
             convert(varchar(max), left(tax2, charindex(';', tax2 + ';') - 1)) as tax2,
             convert(varchar(max), stuff(deposits, 1, charindex(';', deposits + ';'), '')) as deposit_rest,
             convert(varchar(max), stuff(tax1, 1, charindex(';', tax1 + ';'), '')) as tax1_rest,
             convert(varchar(max), stuff(tax2, 1, charindex(';', tax2 + ';'), '')) as tax2_rest
      from t
      union all
      select id, account_number, plan,
             convert(varchar(max), left(deposit_rest, charindex(';', deposit_rest + ';') - 1)) as deposit,
             convert(varchar(max), left(tax2_rest, charindex(';', tax2_rest + ';') - 1)) as tax1,
             convert(varchar(max), left(tax2_rest, charindex(';', tax2_rest + ';') - 1)) as tax2,
             convert(varchar(max), stuff(deposit_rest, 1, charindex(';', deposit_rest + ';'), '')) as deposit_rest,
             convert(varchar(max), stuff(tax1_rest, 1, charindex(';', tax1_rest + ';'), '')) as tax1_rest,
             convert(varchar(max), stuff(tax2_rest, 1, charindex(';', tax2_rest + ';'), '')) as tax2_rest
       from cte
       where deposit_rest <> ''
      )
select *
from cte;

Здесь - это дБ <> скрипка.

0 голосов
/ 29 июня 2019

Если вам нужен один план на acc_number / id и не заботиться о tax1 и tax2, то вы можете использовать это,

select id, account_number, [plan],
convert(varchar(max), left(deposits, charindex(';', deposits) - 1)) as deposit,
convert(varchar(max), left(tax2, charindex(';', tax2) - 1)) as tax1,
convert(varchar(max), left(tax2, charindex(';', tax2) - 1)) as tax2
from ##t

Вывод выглядит так,

id  account_number  plan    deposit tax1        tax2
10  123456          PRINC10     4   4256.45     4256.45
11  123456          KrINC11     4   4256.45     4256.45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...