Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Привет Друзья!
Нужна ваша помощь!
Стоит след. задача передо мной!
Написал мутный запрос, чтобы вывести из групп таблиц нужную инфу!
В результате этого запроса, получил след:

id, first_name, last_name index address tell group!
213 Kolya Nikolaev 1 Lenina st 2-27-63-75 Group56
215 Igor Kozlov 1 Gagarin st 2-07-63-05 Group13
213 Kolya Nikolaev 1 Lenina st 2-27-63-75 Group86
213 Kolya Nikolaev 1 Lenina st 2-27-63-75 Group37


Как Вы уже успели заметить, у меня 3 одинаковых поля, 3 записи, почти, идентичны!
Мне нужно, чтобы эти 3 записи выглядели след. образом!

id, first_name, last_name index address tell group!
215 Igor Kozlov 1 Gagarin st 2-07-63-05 Group13
213 Kolya Nikolaev 1 Lenina st 2-27-63-75 Group37,Group56,Group86

Знаю, что нужно использовать STUFF, но у меня проблема, как в условии WHERE сказать, что нужно выполнить STUFF для тех записей, у которых ID совпадают!

Буду признателен за любую помощЬ!
Спасибо Заранее!
1 дек 14, 15:35    [16931898]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
adimmat,

почитайте про функцию STUFF(). Увидите, что она здесь совершенно не при чём!
1 дек 14, 15:37    [16931918]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
adimmat
Знаю, что нужно использовать STUFF,

Увидели как Менделеев во сне ?
https://www.sql.ru/faq/faq_topic.aspx?fid=130
1 дек 14, 15:38    [16931927]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
adimmat, stuff здесь причем?
Читайте https://www.sql.ru/faq/faq_topic.aspx?fid=731
1 дек 14, 15:40    [16931948]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Вот мой запрос!

DECLARE @from DATETIME = GETDATE()
DECLARE @branch_id INT = 0

SELECT DISTINCT
     [Tiers].[id]
    ,[Persons].[first_name] AS client_first_name
    ,[Persons].[lASt_name] AS client_last_name
 ,COALESCE(Villages.name, Groups.name, '-') AS group_name
   
FROM 
    [dbo].[Persons] LEFT JOIN 
    [dbo].[Tiers] ON [Persons].[id] = [Tiers].[id] LEFT JOIN 
    EconomicActivities EA ON [EA].[id] = [Persons].[activity_id] LEFT JOIN
    [dbo].[VillagesPersons] VP ON [Persons].id = VP.person_id LEFT JOIN
    [dbo].[PersonGroupBelonging] PGB ON [Persons].[id] = PGB.person_id LEFT JOIN
    [dbo].[Groups] ON [Groups].[id] = PGB.group_id LEFT JOIN
    [dbo].[Villages] ON [Villages].[id] = VP.[village_id] LEFT JOIN
 (
  SELECT
   DISTINCT  
    Per.id,
    STUFF((SELECT ', ' + g.name FROM Groups g WHERE  FOR XML PATH('')),1,1,'') AS GroupList
    FROM
    [dbo].[Persons] Per LEFT JOIN 
    [dbo].[VillagesPersons] VillPer ON Per.id = VillPer.person_id LEFT JOIN 
    [dbo].[PersonGroupBelonging] PerGBel ON Per.id = PerGBel.person_id LEFT JOIN
    [dbo].[Groups] Grps ON Grps.id = PergBel.group_id LEFT JOIN
    [dbo].[Villages] Vill ON Vill.id = VillPer.id 
 ) Temp ON Temp.id = [Persons].[id]
 

    WHERE [Tiers].[branch_id] = @branch_id OR @branch_id = 0
 
 ORDER BY client_first_name,client_last_name
1 дек 14, 15:45    [16931977]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
adimmat,

сразу бросается в глаза, что добавляете в начало строки два символа, а убираете STUFFом один.
1 дек 14, 15:47    [16931988]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Как видите, я не смог поставить верное условие в
STUFF((SELECT ', ' + g.name FROM Groups g WHERE  FOR XML PATH('')),1,1,'') AS GroupList
где идет
WHERE

Условие должно быть таким, чтоб ко всем записям с одинаковым ID применялся STUFF!
1 дек 14, 15:49    [16932003]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
adimmat
Как видите, я не смог поставить верное условие в
STUFF((SELECT ', ' + g.name FROM Groups g WHERE  FOR XML PATH('')),1,1,'') AS GroupList

где идет
WHERE

Поток сознания какой-то

adimmat
Условие должно быть таким, чтоб ко всем записям с одинаковым ID применялся STUFF!

А оно у вас выборочно что ли применяется ?
1 дек 14, 15:51    [16932029]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Glory, Да, только к тем строкам, у которых ID совпадают но одновременно принадлежат 2 или более группам!
1 дек 14, 15:53    [16932041]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
adimmat
Условие должно быть таким, чтоб ко всем записям с одинаковым ID применялся STUFF
Строка получается в подзапросе, который должен ссылаеться на основной запрос.
1 дек 14, 15:55    [16932058]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
adimmat
Glory, Да, только к тем строкам, у которых ID совпадают но одновременно принадлежат 2 или более группам!

И чем вы докажите, что STUFF выполняется не для всех записей вашего подзапроса ?
1 дек 14, 16:05    [16932128]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Glory, Сейчас, когда у меня нет условия, Вы правы, Stuff применяется ко всем строкам, вот именно поэтому я поставил это вопрос на форуме! В надежде на вашу помощь! )
1 дек 14, 17:58    [16933098]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Ребята, учел все ваши советы и замечания. Огромное спасибо! Единственное, хотел с вами посоветоваться, как с более опытными юзерами!
Не могли бы Вы мне подсказать, как я могу использовать приведенную внизу конструкцию для своей задачи?
Спасибо!

select [Тип] ,( select [Имя]+ ',' from TEST t2 where t1.[Тип]=t2.[Тип] for xml path(''))
from dbo.TEST t1
group by [Тип]
1 дек 14, 20:23    [16933874]     Ответить | Цитировать Сообщить модератору
 Re: STUFF!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
adimmat
select [Тип] ,( select [Имя]+ ',' from TEST t2 where t1.[Тип]=t2.[Тип] for xml path(''))
from dbo.TEST t1
group by [Тип]
select [Тип],stuff((select ','+[Имя] from TEST t2 where t1.[Тип]=t2.[Тип] for xml path(''), type).value('.','varchar(max)'),1,1,'')
from dbo.TEST t1
group by [Тип]
1 дек 14, 21:29    [16934088]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить