SQL группировка по разделенным данным - PullRequest
2 голосов
/ 02 августа 2020

У меня есть таблица, которая выглядит так:

   Name  |      Temperament
----------------------------------------
 "Husky" | "Smart, Loyal, Cute"
 "Poodle"| "Smart, Cute"
 "Golden"| "Cute, Loyal, Caring, Loving"

И я хочу спроецировать эти данные как группу по темпераментам. Например:

Temperament |             Name            | Count(Optional)
-----------------------------------------------------------   
"Smart"     | "Poodle", "Husky"           | 2
"Loyal"     | "Husky", "Golden"           | 2
"Cute"      | "Poodle", "Golden", "Husky" | 3
"Caring"    | "Golden"                    | 1
"Loving"    | "Golden"                    | 1

Моя проблема в том, что я не смог найти способ разбить строку в моей таблице и управлять этими данными. Было бы здорово, если бы кто-нибудь мог помочь мне с этой проблемой.

Если чистый SQL не может быть выполнен, может быть полезно сообщить, что я использую Entity Framework и можно ли написать решение на может быть даже лучше.

Всем спасибо.

1 Ответ

0 голосов
/ 03 августа 2020

Это можно сделать в чистом виде SQL. В Oracle вы можете использовать функции регулярного выражения и регулярное выражение для разделения строк с разделителями, а затем использовать агрегирование строк для создания списка имен по темпераменту:

with cte (name, temperament, temp, cnt, lvl) as (
    select 
        name, 
        temperament, 
        regexp_substr (temperament, '[^, ]+', 1, 1) temp, 
        regexp_count(temperament, ',') cnt,
        1 lvl 
    from mytable
    union all
    select 
        name, 
        temperament, 
        regexp_substr (temperament, '[^, ]+', 1, lvl  + 1), 
        cnt,
        lvl + 1
    from cte
    where lvl <= cnt
)
select 
    temp temperament, 
    listagg(name, ', ') within group(order by name) name, 
    count(*) cnt
from cte
group by temp
order by 1

Демо на DB Fiddle :

TEMPERAMENT | NAME                  | CNT
:---------- | :-------------------- | --:
Caring      | Golden                |   1
Cute        | Golden, Husky, Poodle |   3
Loving      | Golden                |   1
Loyal       | Golden, Husky         |   2
Smart       | Husky, Poodle         |   2
...