2016-08-19 78 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

相關問題