Получить количество конкатенационных столбцов в sql - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть Конкатенация нескольких столбцов, и я хочу подсчитать, сколько столбцов конкатенировано

вывод запроса и ожидаемый вывод

для конкатенации

select  ConcateColumn = STUFF(
                              COALESCE('* ' + RTRIM(col1),'') 
                             +COALESCE('* ' + RTRIM(col2),'') 
                             +COALESCE('* ' + RTRIM(col4),'') 
                             +COALESCE('* ' + RTRIM(col3),'') 
                       , 1, 2, '') 

таблица

===================================
| col1   | col2  |  col3  |  col4 | 
===================================
|  1     | 2     |  NULL  | NULL  |
|  NULL  | NULL  |  NULL  | NULL  |
|  1     | NULL  |  NULL  | NULL  |
|  NULL  | 2     |  3     | 4     |
|        | NULL  |  NULL  | NULL  |       
==================================

приведенный вывод

 ==============
|ConcateColumn|
 ==============
|1*2          |
|NULL         |
|1            |
|2*3*4        |
|             |
===============

Ожидаемый результат

------------------------
| Count | ConcateColumn |
-------------------------
|   2   |     1*2       |
|   0   |     NULL      |
|   1   |     1         |
|   3   |     2*3*4     |
|   0   |               |
-------------------------

если я получу счет, которого более чем достаточно

Ответы [ 4 ]

0 голосов
/ 11 ноября 2018
 select sum(
case when col1 = '' then 0 when col1 is null then 0 else 1 end +
case when col2 = '' then 0 when col2 is null then 0 else 1 end + 
case when col3 = '' then 0 when col3 is null then 0 else 1 end +
case when col4 = '' then 0 when col4 is null then 0 else 1 end ) 'COUNT',
      ConcateColumn = STUFF(
                          COALESCE('* ' + RTRIM(col1),'') 
                         +COALESCE('* ' + RTRIM(col2),'') 
                         +COALESCE('* ' + RTRIM(col4),'') 
                         +COALESCE('* ' + RTRIM(col3),'') 
                   , 1, 2, '') from temp1
                   group by col1,col2,col3,col4
0 голосов
/ 11 ноября 2018

Вы можете сосчитать число * в объединенной строке:

with cte as 
 (
   select  
      ConcateColumn = STUFF(  COALESCE('* ' + NULLIF(RTRIM(col1),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col2),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col3),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col4),''),'') 
                       , 1, 2, '') 
   FROM T
 )
select ConcateColumn,
   -- how many '*' have been removed?
   coalesce(len(ConcateColumn) - len(replace(ConcateColumn, '*', '')) + 1, 0)
from cte 
;

Конечно, это вернет неправильные числа, если ваши данные содержат *

0 голосов
/ 11 ноября 2018

В SQL Server 2017+ вы можете просто сделать:

select v.*
from t cross apply
     (select count(*) as cnt,
             string_agg(rtrim(col), '* ') within group (order by ord) as ConcateColumn
      from (values (1, col1), (2, col2), (3, col4), (4, col3)
           ) v(col, ord)
      where col is not null
     ) v;

В более ранних версиях я, вероятно, следовал бы той же структуре, что и у вас:

select ( (case when col1 is not null then 1 else 0 end) +
         (case when col2 is not null then 1 else 0 end) +
         (case when col4 is not null then 1 else 0 end) +
         (case when col3 is not null then 1 else 0 end)
       ) as cnt
0 голосов
/ 11 ноября 2018

Вы можете попробовать это.

select  (SELECT count(NULLIF(val,''))
        FROM   (VALUES(col1),(col2),(col3), (col4)) v (val)) 'COUNT',
          ConcateColumn = STUFF(
                              COALESCE('* ' + NULLIF(RTRIM(col1),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col2),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col3),''),'') 
                             +COALESCE('* ' + NULLIF(RTRIM(col4),''),'') 
                       , 1, 2, '')
FROM T

Если вы хотите считать без NULL и '', вы можете попробовать использовать функцию NULLIF.

sqlfiddle

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