Проблема с объединением строк в строку с несколькими соединениями

Я изо всех сил пытаюсь создать оператор в схеме снежинки. Мне нужно показать список всех продуктов и связанных треков, а также включить в каждую строку список имен авторов песен и проценты владения, например. добавьте один столбец, который выглядит так: «Сэм Смит (50,00%), Салли Симпсон (25,00%), Джон Чен (25,00%)». Мои таблицы:

Table: PRODUCT -PRODUCT_ID -ALBUM_ARTIST -ALBUM_TITLE

Table: SONGWRITER -SONGWRITER_ID -FIRSTNAME -LASTNAME

Table: SONG_SONGWRITER -SONGWRITER_ID -TRACK_ID -OWNERSHIP_SHARE

Table: TRACK -TRACK_ID -PRODUCT_ID -TRACK_ARTIST |TRACK_NAME

Я знаю, что мне нужно объединить (и соединить) таблицы SONG_SONGWRITER и SONGWRITER, но я очень растерялся из-за нескольких объединений, необходимых для отображения продуктов и треков.

Я пробовал (и потерпел неудачу):

SELECT prod.*, tra.TRACK_NAME,(SELECT (SELECT ','+ writer.FIRSTNAME +' ' +writer.LASTNAME + '(' + FORMAT(ssw.OWNERSHIP_SHARE,'P2') + ')' FROM SONGWRITER writer INNER JOIN SONG_SONGWRITER ssw ON ssw.SONGWRITER_ID=writer.SONGWRITER_ID FOR XML PATH ('')))
FROM PRODUCT prod
INNER JOIN TRACK tra
ON tra.PRODUCT_ID=prod.PRODUCT_ID
ORDER BY tra.SEQUENCE;

Что касается ожидаемого результата, он должен вернуть что-то вроде этого:

PRODUCT_ID | АЛЬБОМ_ИСПОЛНИТЕЛЬ | АЛЬБОМ_TITLE | ТРЕК_ИМЯ | ВЛАДЕНИЕ

1 | Мясной рулет | летучая мышь из ада | летучая мышь из ада | Мясной рулет (50%), Джонни, автор песен (50%

Кто-нибудь может помочь?


person ConfusedAtITW    schedule 21.11.2019    source источник
comment
обновите свой вопрос, добавьте согласованный образец данных и ожидаемый результат (в виде табличного текста)   -  person scaisEdge    schedule 21.11.2019
comment
Вы используете снежинку или sql-сервер? Это разные продукты.   -  person GMB    schedule 21.11.2019
comment
@GMB использует снежинку на этом.   -  person ConfusedAtITW    schedule 21.11.2019
comment
Что касается ожидаемого результата, он должен вернуть что-то вроде этого: PRODUCT_ID | АЛЬБОМ_ИСПОЛНИТЕЛЬ | АЛЬБОМ_TITLE | ТРЕК_ИМЯ | СОБСТВЕННОСТЬ 1 | Мясной рулет | летучая мышь из ада | летучая мышь из ада | Мясной рулет (50%), Джонни, автор песен (50%)   -  person ConfusedAtITW    schedule 21.11.2019


Ответы (2)


Snowflake не использует нотацию «+» при объединении строк. Вы должны использовать функцию concat() или || обозначение:

https://docs.snowflake.net/manuals/sql-reference/functions/concat.html

person Mike Walton    schedule 21.11.2019

Вы можете объединить 4 таблицы и включить агрегацию. В Snowflake listagg() можно использовать для агрегирования строк:

select 
    p.product_id
    p.album_artist,
    p.album_title,
    t.track_name,
    listagg(concat(s.firstname, ' ', s.lastname, ' (', ss.ownership_share, ')') 
        within group (order by ss.ownership_share) ownership_share
from product p
inner join track t on t.product_id = p.product_id
inner join song_songwriter ss on ss.track_id = p.track_id
inner join songwriter s on s.songwriter_id = ss.songwriter_id
group by
    p.product_id
    p.album_artist,
    p.album_title,
    t.track_name
order by p.product_id, t.sequence;
person GMB    schedule 21.11.2019