2012-11-08 41 views
0

該查詢獲取所需的行 - 按主題組織 - 我也想知道每個組中的項數。如何分組和計數組中的項目並獲得整行?

SELECT log.* FROM [hm_deliverylog] AS log 
WHERE log.deliveryid IN 
    (
     SELECT MAX([deliveryid]) FROM [hm_deliverylog] 
     WHERE [deliverytime] > DATEADD(HOUR, -12, GETDATE()) 
     GROUP BY deliverysubject 
    ) 

ORDER BY deliveryid DESC 

如何計算組?像下面一樣?

SELECT joined.groupcount, log.* FROM [hm_deliverylog] AS log 

P.S:想象一下Gmail收件箱;它顯示最新的消息並顯示消息計數。我想組相同主題的消息,並盡數...

回答

1

一種方法是把COUNT()計算的子查詢,而不是使用IN,使之成爲派生表要加入:

SELECT log.* 
    , grp.cnt AS groupcount 
FROM 
    [hm_deliverylog] AS log 
    JOIN 
    (
     SELECT MAX([deliveryid]) AS deliveryid 
      , COUNT(*) AS cnt 
     FROM [hm_deliverylog] 
     WHERE [deliverytime] > DATEADD(HOUR, -12, GETDATE()) 
     GROUP BY deliverysubject 
    ) AS grp 
    ON grp.deliveryid = log.deliveryid 
ORDER BY 
    log.deliveryid DESC ; 
+0

這就是我試過的和失敗的......謝謝! –

1

您可以使用OVER clause

SELECT COUNT(deliveryid) OVER (PARTITION BY deliverysubject) As GroupCount 

確定行集的劃分和排序的 相關的窗口功能被應用之前。也就是說,OVER子句 在查詢結果 集內定義了一個窗口或用戶指定的一組行。窗口函數然後計算 窗口中每行的值。您可以使用帶有函數的OVER子句來計算彙總值,例如移動平均值,累計彙總數,運行總計數 或每組最高結果N。

0
SELECT log.*, COUNT(*) OVER (PARTITION BY deliverysubject) AS groupcount 
FROM [hm_deliverylog] AS log 
GROUP BY deliverysubject 
+0

請檢查編輯答案。 – TechDo

相關問題