Как получить максимальный COUNT строки через запятую в Oracle? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть таблица, в которой хранятся данные, подобные этим.

MANUFACTURER_PART_NUMBER|MANUFACTURER_NAME        |TEST_PLAN           |ATTACHED_SUPPLIER_DOCUMENT |ATTACHED_LOGITECH_REPORT|
------------------------|-------------------------|--------------------|---------------------------|------------------------|
001059-0000             |CHENGDA                  |268452,268453       |268456,268457,268459,268460|268465                  |
001059-0000             |SHANGHAI MARRISON CO.,LTD|                    |268458,268462              |                        |
001059-0000             |SUZHOU SHARETECH         |                    |                           |                        |
001059-0000             |SYSTRON                  |268451,268452,268453|268456,268457,268459,268460|268465,268466           |

Я хочу получить максимальное количество столбцов, разделенных запятыми. Например, TEST_PLAN имеет максимум 3 значения в 4-й строке, но ATTACHED_SUPPLIER_DOCUMENT имеет 4 значения, поэтому я хочу, чтобы выходные данные возвращали 4 в качестве максимального числа.

Я пробовал этот запрос, чтобы узнать количество значений этих столбцов.

WITH CTE AS(
SELECT DISTINCT 
MP.PART_NUMBER MANUFACTURER_PART_NUMBER, M.NAME MANUFACTURER_NAME, 
RTRIM(LTRIM(PG3.MULTILIST31, ','), ',') TEST_PLAN, regexp_count(MULTILIST31, ',') + 1 AS COL1,
RTRIM(LTRIM(PG3.MULTILIST32, ','), ',') ATTACHED_SUPPLIER_DOCUMENT, regexp_count(MULTILIST32, ',') + 1 AS COL2,
RTRIM(LTRIM(PG3.MULTILIST33, ','), ',') ATTACHED_LOGITECH_REPORT, regexp_count(MULTILIST33, ',') + 1 AS COL3 
FROM MANU_PARTS MP
INNER JOIN MANUFACTURERS M ON M.ID = MP.MANU_ID 
LEFT JOIN PAGE_TWO PG2 ON PG2.ID = MP.ID
LEFT JOIN PAGE_THREE PG3 ON PG3.ID = MP.ID

WHERE PART_NUMBER = '001059-0000'
)
SELECT * FROM CTE

Вывод, который я ищу, выглядит примерно так ..

MANUFACTURER_PART_NUMBER|MANUFACTURER_NAME        |TEST_PLAN           |ATTACHED_SUPPLIER_DOCUMENT |ATTACHED_LOGITECH_REPORT|MAXCOUNT|
------------------------|-------------------------|--------------------|---------------------------|------------------------|--------|
001059-0000             |SYSTRON                  |268451,268452,268453|268456,268457,268459,268460|268465,268466           |       4|
001059-0000             |CHENGDA                  |268452,268453       |268456,268457,268459,268460|268465                  |       4|
001059-0000             |SHANGHAI MARRISON CO.,LTD|                    |268458,268462              |                        |       4|
001059-0000             |SUZHOU SHARETECH         |                    |                           |                        |       4|

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Используйте REGEXP_COUNT для подсчета запятых. Используйте GREATEST, чтобы получить максимальное количество:

select
  greatest(
    regexp_count(test_plan, ','),
    regexp_count(attached_supplier_document, ','),
    regexp_count(attached_logitech_report, ',')
  ) + 1
from mytable;

Если вы хотите максимум по всем строкам, используйте MAX:

select
  max(
    greatest(
      regexp_count(test_plan, ','),
      regexp_count(attached_supplier_document, ','),
      regexp_count(attached_logitech_report, ',')
    ) + 1
  )
from mytable;

Если вы хотите, чтобы максимальное число было показано с каждой строкой, используйте MAX(...) OVER () вместо MAX(...).

(Это дает счетчик 1, если в столбце нет значения вообще. Этого можно избежать с помощью выражения CASE , но я полагаю, что в этом даже нет необходимости, так как всегда может быть значение хотя бы в одном из столбцов.)

РЕДАКТИРОВАТЬ: (Гордоном)

Возможно, вам понадобится COALESCE() если любое из значений NULL:

select
  greatest(
    coalesce(regexp_count(test_plan, ','), 0),
    coalesce(regexp_count(attached_supplier_document, ','), 0),
    coalesce(regexp_count(attached_logitech_report, ','), 0)
  ) + 1
from mytable;
0 голосов
/ 07 апреля 2020

Вам не нужны регулярные выражения, и вместо этого вы можете удалить запятые и сравнить длину строк до и после замены и добавить 1, чтобы получить количество элементов. Затем вы можете использовать GREATEST, чтобы найти максимум по столбцам, и функцию analyti c MAX, чтобы найти его по всем строкам:

SELECT t.*,
       MAX(
         GREATEST(
           COALESCE(
             LENGTH( test_plan )
             - LENGTH( REPLACE( test_plan, ',' ) )
             + 1,
             0
           ),
           COALESCE(
             LENGTH( attached_supplier_document )
             - LENGTH( REPLACE( attached_supplier_document, ',' ) )
             + 1,
             0
           ),
           COALESCE(
             LENGTH( attached_logitech_report )
             - LENGTH( REPLACE( attached_logitech_report, ',' ) )
             + 1,
             0
           )
         )
       ) OVER ( PARTITION BY manufacturer_part_number )
         AS maxcount
FROM   table_name t

(Удалить PARTITION BY manufacturer_part_number поэтому у вас есть MAX( ... ) OVER (), если вы хотите найти максимум по всем строкам, а не по каждому номеру детали.)

Итак, для ваших тестовых данных:

CREATE TABLE table_name (
       MANUFACTURER_PART_NUMBER, MANUFACTURER_NAME,         TEST_PLAN,             ATTACHED_SUPPLIER_DOCUMENT,   ATTACHED_LOGITECH_REPORT
) AS
SELECT '001059-0000',           'CHENGDA',                  '268452,268453',       '268456,268457,268459,268460','268465'        FROM DUAL UNION ALL
SELECT '001059-0000',           'SHANGHAI MARRISON CO.,LTD',NULL,                  '268458,268462',              NULL            FROM DUAL UNION ALL
SELECT '001059-0000',           'SUZHOU SHARETECH',         NULL,                  NULL,                         NULL            FROM DUAL UNION ALL
SELECT '001059-0000',           'SYSTRON',                  '268451,268452,268453','268456,268457,268459,268460','268465,268466' FROM DUAL;

Это выводит :

MANUFACTURER_PART_NUMBER | MANUFACTURER_NAME         | TEST_PLAN            | ATTACHED_SUPPLIER_DOCUMENT  | ATTACHED_LOGITECH_REPORT | MAXCOUNT
:----------------------- | :------------------------ | :------------------- | :-------------------------- | :----------------------- | -------:
001059-0000              | CHENGDA                   | 268452,268453        | 268456,268457,268459,268460 | 268465                   |        4
001059-0000              | SYSTRON                   | 268451,268452,268453 | 268456,268457,268459,268460 | 268465,268466            |        4
001059-0000              | SUZHOU SHARETECH          | <em>null</em>                 | <em>null</em>                        | <em>null</em>                     |        4
001059-0000              | SHANGHAI MARRISON CO.,LTD | <em>null</em>                 | 268458,268462               | <em>null</em>                     |        4

db <> скрипка здесь

...