2016-03-08 74 views
1

我有一個表ExchangeUserMailbox的列HAVING MAX(值)未在SQL Server查詢工作

  • OrganisationID(GUID)
  • MailboxLocationName(STRING)
  • MailboxCode(STRING)
  • DayofMon (INT)
  • UPN(STRING)

的POSS DayofMon的Ible值是「15」和「30」(我有數據在每個月的兩天中都會發送到這個表格中,例如: - 第14和第30,15或31)

我正在運行以下SQL腳本

SELECT 
    [OrganisationID] 
    ,[MailboxLocationName] AS Location 
    ,MailboxCode as LocationCode 
    ,DayofMon 
    ,COUNT(DISTINCT [UPN]) AS [Count] 
FROM 
    [ExchangeUserMailbox] 
GROUP BY 
    [OrganisationID], [MailboxLocationName], DayofMon, MailboxCode 
HAVING 
    DayofMon = MAX(DayofMon) 

我的目的是讓所有的記錄與DayofMon最大值和聚集的UPN的計數。

但在輸出窗口我得到

OrganisationID        Location  LocationCode DayofMon Count 

2EC8650F-8902-4CFB-BE0E-A218982EDEEC  Diffraction   DIF   1  3 
2EC8650F-8902-4CFB-BE0E-A218982EDEEC  Diffraction   DIF   30  10 

正如你可以看到它聚集dayofmon= 1dayofmon=30。但我只想彙總dayofmon=30

我在這裏做錯了什麼?

+0

我覺得你的'HAVING'子句在這裏沒用。如果你想要30,那麼你應該: 'HAVING MAX(DayofMon)= 30' –

+0

另外,收集數據在30日並不是很好,因爲不是每個月*有* 30日(即2月)。我會親自選擇1號和15號。 –

回答

0

試試看hard_code ...有了DayofMon> 15 ... 我更像一個Oracle傢伙,所以從我的經驗來看,你不能在Having的結果中放置Windowed函數。

0

試試這個:在select上使用max函數。

SELECT 
    [OrganisationID] 
    ,[MailboxLocationName] AS Location 
    ,MailboxCode as LocationCode 
    ,Max(DayofMon) as [DayofMon] 
    ,COUNT(DISTINCT [UPN]) AS [Count] 
FROM 
    [ExchangeUserMailbox] 
GROUP BY 
    [OrganisationID], [MailboxLocationName], MailboxCode 
0

HAVING子句是專爲用於通過聚集計算濾波,因此它被執行的後GROUP BY是完整的,因此它可以訪問該聚合值。您需要進行過濾之前進行分組,因此having子句沒有幫助。

你可以只篩選其中DayOfMon是在(28,29,30或31)

SELECT 
     OrganisationID 
     , MailboxLocationName AS Location 
     , MailboxCode   AS LocationCode 
     , 30     AS DayofMon 
     , COUNT(DISTINCT UPN) AS [Count] 
FROM [ExchangeUserMailbox] 
WHERE DayofMon IN (28,29,30,31) 
GROUP BY 
     OrganisationID 
     , MailboxLocationName 
     , MailboxCode 

或者你可以作出這樣使用ROW_NUMBER()的數據:

SELECT 
     OrganisationID 
     , Location 
     , LocationCode 
     , 30     AS DayofMon 
     , COUNT(DISTINCT UPN) AS [Count] 
FROM (
     SELECT 
       OrganisationID 
       , MailboxLocationName AS Location 
       , MailboxCode   AS LocationCode 
       , UPN 
       , ROW_NUMBER() OVER (PARTITION BY OrganisationID 
               , MailboxLocationName 
               , MailboxCode 
            ORDER BY DayofMon DESC) AS rn 
     FROM [ExchangeUserMailbox] 
     ) AS d 
WHERE d.rn = 1 
GROUP BY 
     OrganisationID 
     , Location 
     , LocationCode 
; 

哪將爲每個「分區」具有最大DayOfMon的每行賦予數字1

0

最直接的方法是使用子查詢:

SELECT 
    eum.[OrganisationID] 
    ,eum.[MailboxLocationName] AS Location 
    ,eum.MailboxCode as LocationCode 
    ,eum.DayofMon 
    ,COUNT(DISTINCT [eum.UPN]) AS [Count] 
FROM 
    [ExchangeUserMailbox] AS eum 
WHERE eum.DayofMon = 
     (SELECT MAX(eum2.DayofMon) 
     FROM [ExchangeUserMailbox] AS eum2 
     WHERE eum2.[OrganisationID] = eum.[OrganisationID] 
     AND eum2.[MailboxLocationName] = eum.[MailboxLocationName] 
     AND eum2.MailboxCode = eum.MailboxCode 
    ) 
GROUP BY 
    eum.[OrganisationID], eum.[MailboxLocationName], eum.DayofMon, eum.MailboxCode 

「硬編碼」解決方案的工作,但更脆弱。這樣,你一定會得到DayofMon值最高的記錄(即使它是一個意外的值),你會得到DayofMon的實際值而不是硬編碼值。