2016-08-19 3 views
-1

У меня есть таблица под названием SpeakerSessions, который содержит следующие столбцы:SQL Server создать отчет писем

Created - datetime 
Processed - float (boolean) 
Dateprocessed - datetime 
Conference - varchar 
Session - varchar 
FDBue - datetime 
Speaker - varchar 
Email - varchar 
Type - varchar 
ID - int 

То, что я хочу, это запрос, отчет, или вид, что покажет мне, что сессии спикер представляет на, и срок их представления содержания, что-то похожее на:

speaker conference  session  fbdue 
----------------------------------------------------- 
Joe   Conf1  SessionA 1/1/2010 
      Conf1  SessionB 1/1/2010 
      Conf2  SessionE 1/10/2010 
Amy   Conf1  SessionA 1/3/2010 
      Conf2  SessionB 1/3/2010 

Как я могу достичь этого в SQL Server? Столбец ID является столбцом идентификации. Один и тот же оратор может выступать на нескольких сессиях на конференции.

+0

Вы ищете строку динамиков, чтобы появляться только один раз и не иметь нескольких Джо и Эми? – Zi0n1

+0

@ Zi0n1 Да! В точку. Динамик появится один раз, а затем ваши конференции и сеансы появятся в одной строке и сколько потребуется после нескольких строк после этого. – z0nia

+0

Это простой 'select'. Вы даже пытались сделать это для себя? – shawnt00

ответ

0
select 
    case 
     when row_number() over (
       partition by coalesce(speaker, email) 
       order by conference, session 
      ) = 1 
     then coalesce(speaker, email) 
    end as speaker, 
    conference, session, fbdue 
from SpeakerSessions 
order by coalesce(speaker, email), conference, session; 

Эта проблема заключается в знании того, какая строка является первой в ряду строк. Такая информация не может быть определена путем поиска внутри самой строки.

Оглядываясь на другие строки, в основном, что это за аналитические/оконные функции. row_number() - это номер, который применяет нумерацию к набору строк в указанном порядке. partition by ограничивает нумерацию для каждой колонки и позволяет ее сбросить на следующую. order by также очень важен и соответствует order by результатов запроса (после speaker).

В конечном счете выражение говорит об этом: если мы находимся в первой строке, тогда возвращаем имя динамика, иначе возвращаем пустой (пустой). В зависимости от того, как вы планируете использовать это, вы можете предпочесть возвращать пустую строку с else '' вместо нулевого значения по умолчанию.

Многие средства отчетности имеют параметр «подавлять повторяющиеся значения» для обработки этой логики для вас. Это также было бы легко сделать в Excel с формулой, которая смотрит на предыдущую ячейку, если вы извлекаете данные в электронную таблицу.

+0

Ничего себе, это почти то, что я ищу! Мне пришлось заказывать по электронной почте вместо имени динамика, потому что сначала показывали «Нули». Однако, когда я запускаю это, есть дубликаты, когда их не должно быть. Каждый динамик появляется один раз, но есть дубликат conference-session-fbdue – z0nia

+0

@ z0nia Нет никакого способа для этого запроса ввести дубликаты, которые еще не были в данных. Я полагаю, что некоторые строки могут * появляться *, чтобы быть dup, но их нужно было бы перетасовать из ожидаемого порядка. Трудно делать догадки, не видя данных. Возможно, 'row_number()' не соответствует окончательному 'order by'. – shawnt00

+0

В таблице SpeakerSessions есть один докладчик, который представляет на одной конференции и делает только один сеанс. Результаты запроса показывают, что speakerA - confA - sessionA - fbdue. Строка непосредственно под ней показывает ту же самую вещь, за исключением того, что динамик имеет значение null: null -confA - sessionA - fbdue – z0nia