2013-03-17 268 views

回答

0

我能夠如下解決這個問題:

WITH cteActivityIds (activityId, allDocuByActivity) 
AS 
    (SELECT activityId, COUNT(*) AS allDocuByActivity FROM #ER GROUP BY activityId) 
SELECT 
     E.activityId AS [Actiivty ID], 
     docuType AS [Docu Type], 
     COUNT(docuType), 
     CONVERT(DECIMAL(16,2), (COUNT(docuType) * 100.00/t.allDocuByActivity)) [Total  DocuType in Activity], 
     SUM(CASE WHEN [sent] != '1-1-1900' THEN 1 END) AS [Sent], 
     SUM(CASE WHEN [approved] != '1-1-1900' THEN 1 END) AS [Approved] 
FROM 
     #ER AS E 
INNER JOIN cteActivityIds AS t 
    ON E.activityId = t.activityId 
GROUP BY 
    E.activityId, docuType, t.allDocuByActivity 

感謝

0

這裏是一個解決方案,在我意見,看起來有點清潔 - 它不需要連接並使用「分區依據」來計算個人計數:

WITH activityCounts as (
    select 
     activityId, 
     docuType, 
     count(activityId) OVER(PARTITION BY activityId) as activityIdCount, 
     count(docuType) OVER(PARTITION BY activityId, docuType) as docuTypeCount, 
     SUM(CASE WHEN [sent] != '1-1-1900' THEN 1 END) OVER(PARTITION BY activityId, docuType) AS [Sent], 
     SUM(CASE WHEN [approved] != '1-1-1900' THEN 1 END) OVER(PARTITION BY activityId, docuType) AS [Approved] 
    from ER 
) 
SELECT 
    activityId, 
    docuType, 
    docuTypeCount, 
    CONVERT(DECIMAL(16,2), (COUNT(docuTypeCount) * 100.00/activityIdCount)) as [Total DocuType in Activity], 
    [Sent], 
    [Approved] 
FROM activityCounts 
GROUP BY 
    activityId, 
    docuType, 
    activityIdCount, 
    docuTypeCount, 
    [Sent], 
    [Approved] 

這裏是一個link to sqlfiddle

0

你只需要把一個聚合函數上t.allDocuByActivity

MIN(t.allDocuByActivity) AS [Total DocuType in Activity], 

然而,由於您的標籤是DocuType。你不需要DISTINCT