Как преобразовать результат запроса в агрегат количества каждой строки - PullRequest
0 голосов
/ 12 июня 2019

Вот результат запроса:

      LNAME   |    LISTAGG
--------------+---------------
              | ALEX
 BAIRSTOW     |
 BROAD        | STUART
 BUTLER       |
 COOK         | ALAISTER,ALEX
 HALES        | ALEX
 JENNINGS     |
--------------+---------------
(7 rows)

Я хотел бы получить результат 0, 1 или количество записей в строке, таких как (ALAISTER, ALEX), равны 2 и пустому формату.

Таким образом, вывод должен выглядеть следующим образом:

  LNAME   |    LFNAME     | LNAME_COUNT  | LFNAME_COUNT
----------+---------------+--------------+-------------
 BROAD    | STUART        | 1            |   1
 BAIRSTOW |               | 1            |   0
 COOK     | ALAISTER,ALEX | 1            |   2
          | ALEX          | empty        |   1
 JENNINGS |               | 1            |   empty
 HALES    | ALEX          | 1            |   1
 BUTLER   |               | 1            |   0
----------+---------------+--------------+-------------
(7 rows)

Я использовал выражение case, но не смог выделить часть (ALAISTER, ALEX).

Ответы [ 2 ]

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

Следующий запрос сделает то, что вы ищете

     Declare @table table ( lname  varchar (20),   listagg varchar (20));

insert into @table ( lname , listagg ) values
(''        , 'alex'),
('bairstow', null),
('broad'   , 'stuart'),
('butler'  , ''),
('cook'    , 'alaister,alex'),
('hales'   , 'alex'),
('jennings', null);

 select 
  lname,
  listagg as LFName,
  case when lname <>'' then len(lname)-len(replace(lname,',',''))+1 else 0 end as LName_count,
  case when listagg <>'' then len(listagg)-len(replace(listagg,',',''))+1 else 0 end  as LFName_count
  from @table
0 голосов
/ 12 июня 2019

В SQL Server вы можете сделать это, используя LEN().

SELECT LNAME, LISTAGG AS LFNAME,
       CASE WHEN LNAME IS NULL THEN CAST(0 AS VARCHAR (5))
            WHEN LEN(LNAME) > 1 THEN CAST((LEN(LNAME) - LEN(REPLACE(LNAME, ',', ''))) + 1 AS VARCHAR (5))
       ELSE 'empty' END AS LNAME_COUNT,
       CASE WHEN LISTAGG IS NULL THEN CAST(0 AS VARCHAR (5))
            WHEN LEN(LISTAGG) > 1 THEN CAST((LEN(LISTAGG) - LEN(REPLACE(LISTAGG, ',', ''))) + 1 AS VARCHAR (5)) 
       ELSE 'empty' END AS LFNAME_COUNT
FROM TableName

Демонстрация на db <> fiddle для SQL Server

Если вашей СУБД является MySQL, просто измените LEN() на LENGTH()

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