2016-09-08 4 views
0

У меня есть стол с динамиком, сессия, конференция, электронная почта. моя цель - сделать запрос, который объединяет конференцию и сеанс в одно поле, чтобы мы могли применить к нему HTML-код и отформатировать его при предварительном просмотре в другом месте.
Проблема здесь в том, что докладчик посещает две конференции разностей и представляет разные сессии. Этот запрос как-то дублирует сессии с одной конференции и подает его на вторую конференцию:
sql group by дублирует значения?

SELECT speaker AS 'speakername', email AS 'email', 
CAST(
    (SELECT conference AS 'strong', 
     (SELECT session AS 'session' from speakersessions AS ds 
     WHERE ds.speaker = dd.speaker 
     GROUP BY session 
     for xml path(''), type) AS 'sessions' 
    FROM speakersessions AS ds 
    WHERE ds.speaker = dd.speaker 
    GROUP BY conference 
    for xml path(''), type) 
AS NVARCHAR(MAX)) 
AS 'conferences' 
FROM speakersessions AS dd 
GROUP BY speaker, email 

результатов, которые показывают для диктора 'Грега является:

<strong>Business Planning </strong> 
<sessions><session> 
10 tips to fast-track 
</session><session> 
Hybrid planning 
</session><session> 
Planning on the cloud 
</session><session> 
The Boardroom 
</session></sessions> 
<strong>Reporting Analytics</strong> 
<sessions><session> 
10 tips to fast-track 
</session><session> 
Hybrid planning 
</session><session> 
Planning on the cloud 
</session><session> 
The Boardroom 
</session></sessions> <br/> 

(я добавил разрывы строк) , но как вы можете видеть, это не то, что таблица speakersessions показывает:

 
Conference     Session 
Business Planning | 10 tips to fast-track 
Business Planning | Hybrid planning 
Reporting Analytics | Planning on the cloud 
Reporting Analytics | The Boardroom 

около того сессий для reporti ng аналитики не заполняются. Что тут происходит?

+2

Похоже, ваш присоединиться к 'WHERE ds.speaker = dd.speaker' недостаточно тогда. Возможно, также присоединиться к конференции в этом коррелированном подзапросе? – JNevill

+0

@JNevill Я пробовал это, но он дает мне ошибку «Column» speakersessions.Conference 'недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. " Я попытался поместить его в оба предложения WHERE: 'WHERE ds.saker = dd.speaker и ds.conference = dd.conference' – z0nia

+0

Вам просто нужно это во внутреннем WHERE. Добавьте «конференцию» в группу GROUP BY соответствующего коррелированного подзапроса. – JNevill

ответ

0

SELECT speaker AS 'speakername', email, CAST( (SELECT conference AS 'strong', (SELECT session AS 'session' from speakersessions AS part3 WHERE part3.conference = part2.conference and part3.email = part1.email GROUP BY session,conference for xml path(''), type) AS 'sessions' FROM speakersessions AS part2 WHERE part1.email = part2.email GROUP BY part2.conference for xml path(''), type) AS NVARCHAR(MAX)) AS 'conferences' FROM speakersessions AS part1 GROUP BY email, speaker
должен был убедиться, что конференция была добавлена, но что это было объединено с правильным подзапросом