2016-08-19 80 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 byspeaker之后)非常匹配。

表达式最终表达如下:如果我们在第一行然后返回扬声器的名称,否则返回null(空白)。根据您打算如何使用此选项,您可能更愿意使用else ''而不是缺省空值返回空字符串。

许多报告工具都有一个“抑制重复值”选项来处理您的逻辑。在Excel中执行此操作也很容易,如果您要将数据提取到电子表格中,则该公式会查看以前的单元格。

+0

哇,这几乎是我正在寻找的!我必须通过电子邮件而不是发言人名称来订购,因为空值首先出现。但是,当我运行这个时,应该不会有重复。每个演讲者出现一次,但有重复的会议会议fbdue – z0nia

+0

@ z0nia此查询无法引入尚未存在于数据中的重复项。我想有些行可能会出现成为dups,但他们必须从预期的顺序中进行洗牌。没有看到数据就很难做出猜测。也许'row_number()'不匹配最后的'order by'。 – shawnt00

+0

在SpeakerSessions表中,有一位发言者A在一次会议上发言,只进行一次会议。查询结果显示speakerA - confA - sessionA - fbdue。直接在该行之下的行显示除了发言者为空之外的完全相同的东西:null -confA - sessionA - fbdue – z0nia

相关问题