Выделите отличные на каждом из многих столбцов - PullRequest
0 голосов
/ 19 октября 2018

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

CNUM    col1    col2    col3
A1        No     124    30
A1        No     125    31
A2        Yes    123    21
A2         No    123    22

Мне нужно обработать эти данные для загрузки в другую таблицу с одной строкой с правилом, согласно которому, если от col1 до col3 имеет более одного отдельного значения, этопереносится как NULL.Набор результатов должен выглядеть следующим образом:

CNUM    col1    col2    col3
A1       No     NULL    NULL
A2       NULL   123     NULL 

Я начал делать это своим SQL ниже:

Select distinct CNUM,
Case when qty<>1 then null
else col1 END as col1,
Case when qty<>1 then null
else col2 END as col2,
Case when qty<>1 then null
 else col3 END as col3
From Table1
Left join (
  Select distinct CNUM ,qty from 
        (select CNUM, count(*) as qty
         FROM Table 1 
         Group by CNUM
         having count(*) >1
         )p
    )p1
 on p1.CNUM=Table1.CNUM

Но приведенный выше запрос дает мне результат, как показано ниже, а не то, что янеобходимость.

CNUM    col1    col2    col3
 A1       NULL   NULL    NULL
 A2       NULL   NULL     NULL 

A1, Col1 и A2, Col2 должны иметь значения, а не нуль.Есть идеи, что я делаю не так.

Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

Я переписал весь запрос, пожалуйста попробуйте это:

select
  q1.cnum,
  case when col1_distincts>1 then null else col1_val end col1,
  case when col2_distincts>1 then null else col2_val end col2,
  case when col3_distincts>1 then null else col3_val end col3
from (
    select cnum
    from Table1
    group by cnum
  ) q1
  join (
    select c1.cnum,
      c1.col1_distincts, c1.col1_val,
      c2.col2_distincts, c2.col2_val,
      c3.col3_distincts, c3.col3_val
    from (
        select cnum, count(*) col1_distincts, max(col1) col1_val
        from (
          select cnum, col1
          from Table1
          group by cnum, col1
        ) group by cnum
      ) c1
      join (
        select cnum, count(*) col2_distincts, max(col2) col2_val
        from (
          select cnum, col2
          from Table1
          group by cnum, col2
        ) group by cnum
      ) c2 on c1.cnum=c2.cnum
      join (
        select cnum, count(*) col3_distincts, max(col3) col3_val
        from (
          select cnum, col3
          from Table1
          group by cnum, col3
        ) group by cnum
      ) c3 on c1.cnum=c3.cnum
  ) q2 on q1.cnum=q2.cnum

1-я попытка:

Я внес некоторые изменения в ваш подзапрос p1, например, так:

Select distinct Table1.CNUM,
  Case when qty1<>1 then null
    else col1 END as col1,
  Case when qty2<>1 then null
    else col2 END as col2,
  Case when qty3<>1 then null
    else col3 END as col3
From Table1
  Left join (
     select CNUM, count(distinct col1) as qty1,
       count(distinct col2) as qty2,
       count(distinct col3) as qty3
     FROM Table1 
     Group by CNUM
 ) p1
 on p1.CNUM=Table1.CNUM

И я также учел различные значения для столбцов.

Ваш исходный подзапрос проверяет только более 1 записи на CNUM.

...