2013-03-17 145 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