#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 году. Кроме того, это не даст правильного результата для PersonA2. Не проверено, но простите, что я не упомянул, что мой 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 не поддерживается