2013-03-17 3 views
0

Я пишу запрос, который группирует более двух столбцов. это означает, что он будет помещать Col1 и Col2 в ту же группу.Группа по нескольким столбцам, SUM в первой группе по столбцу

Как я могу сделать СУММ записей на основе группы Col1?

меня это до сих пор: http://sqlfiddle.com/#!3/eada2/1

Спасибо

+0

Какой ваш желаемый результат? –

+0

Для каждой строки я хочу показать общее количество DocumentTypes в пределах одного идентификатора активности. – Bill

ответ

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

Вот решение, которое, по моему мнение, выглядит немного чище - он не требует объединения и использует «раздел by» для расчета отдельных счетчиков:

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?

Смежные вопросы