Инструкция Create view или select

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я новичок в SQL и у меня возникли некоторые проблемы с созданием представления. Это моя текущая структура таблицы :

Разместить Человек Фрукты
MarketA ПерсонА Apple
MarketB ПерсонА Оранжевый
MarketB ПерсонА Apple
MarketC PersonB Оранжевый
MarketA PersonC Apple
MarketB PersonD

Моя цель — создать представление, подобное приведенному ниже :

Человек Фрукты
ПерсонА Яблоко / Оранжевый
PersonB Оранжевый
PersonC Apple
PersonD

Может мне помочь, как я могу этого добиться?

Комментарии:

1. Где именно вы застряли? Вам нужно объяснить, в чем заключается ваша трудность.

2. Когда люди начнут выполнять работу за всех, кто задает вопрос, без подробностей, о которых спрашивал Larnu (в данном случае), общее качество SO снизится (еще больше).

3. @Larnu я просто не представляю, как я могу это архивировать .. либо это возможно, либо нет на уровне SQL.

4. @Luuk Конечно, я опубликую любую ошибку, если столкнусь с какими-либо трудностями, но здесь я понятия не имею, с чего начать, или ключевое слово, которое я могу использовать в Google, чтобы проверить тему.

Ответ №1:

Прежде всего, это поможет, если вы добавите CREATE TABLE к своему вопросу, но ваш пример с таблицей также действительно помогает. Вы можете достичь этого (особенно в более ранних версиях SQL Server) с помощью этого оператора:

 SELECT DISTINCT Person,
        STUFF(
                (
                    SELECT DISTINCT '/'   A.Fruit Fruits
                    FROM TableA  A
                    WHERE A.Person = B.Person
                    ORDER BY Fruits
                    FOR XML PATH(''), TYPE
                ).value('.', 'varchar(max)'),
                1,
                1,
                ''
            ) Fruit
FROM TableA B
 

Я знаю, что в SQL 2017/2019 есть более простой способ, но назовите меня старомодным…

Комментарии:

1. Это вернет XML, а не набор данных.

2. Ответил слишком быстро, я исправил код.

3. Спасибо @RonaldHensbergen . это то, что я ищу.

Ответ №2:

Использование SQL SERVER 2017 или выше:

 CREATE VIEW my_view
AS
SELECT PERSON, STRING_AGG(Fruit,'/') AS Fruit
FROM (
   SELECT DISTINCT PERSON, Fruit
   FROM  groupedtable
)a
GROUP BY Person;
 

Комментарии:

1. STRING_AGG был добавлен в 2017, а не в 2016 году. Кроме того, это не даст правильного результата для PersonA

2. Не проверено, но простите, что я не упомянул, что мой SQL server не поддерживает STRING_AGG ..

Ответ №3:

Попробуйте это;

 WITH groupedtable AS (
SELECT DISTINCT Person, Fruit
FROM yourtable
)
SELECT Person, STRING_AGG(Fruit, '/') AS Fruit
FROM groupedtable
GROUP BY Person;
 

Смотрите демонстрацию

Комментарии:

1. Извините, что не упомянул о моей версии SQL.. он не поддерживает STRING_AGG. Но спасибо за демонстрацию, выглядит нормально, если поддерживается, и мне действительно полезно изучить.

2. Какие СУБД вы используете? И какая версия?

3. Привет, @Okechukwu Ossai, я использую SQL server 2016, который STRING_AGG не поддерживается