2010-05-21 89 views
1

我有一组由filenbr,打开日期和关闭日期组成的数据。T-SQL问题 - 计数和平均值

我需要生成一个类似于下面的摘要表,我需要计算每个周期有多少个文件,但是我需要那些大于20个分组在一起的文件。我知道如何获得DATEDIFF,就是我磕磕绊绊上是如何得到20+和百分比列

1 day - 30 files - 30% 
3 days - 25 files - 25% 
10 days - 5 files - 5% 
13 days - 20 files - 20% 
>= 20 days - 20 files - 20% 
+0

“3天”意味着开放日期和结束日期之间的差异恰好是3天,最多3天还是至少3天? – Thomas 2010-05-21 19:49:17

回答

1

假设你有一个名为dayFile有以下的列

表DayFile

days - files 
1 - 10 
1 - 5 
1 - 15 
3 - 20 
3 - 5 
10 - 5 
13 - 20 
20 - 5 
22 - 5 
28 - 10 

那么你可以做以下

SELECT 
    SummaryTable.Day, 
    SUM(SummaryTable.Files) as SumFiles, 
    Sum(SummaryTable.Files)/SummaryTable.TotalFiles 
    FROM 
    (SELECT 
     CASE WHEN (days >= 20) THEN 
     20 
     ELSE DF.days END as Day 
     files, 
     (SELECT Count(*) FROM DayFile DFCount) as TotalFiles 
    FROM DayFile DF) SummaryTable 
Group By SummaryTable.Day 

编辑:

SELECT 
    SummaryTable.Day, 
    SUM(SummaryTable.Files) as SumFiles, 
    Sum(SummaryTable.Files)/(SELECT Count(*) FROM DayFile DFCount) 
FROM 
    (SELECT 
     CASE WHEN (days >= 20) THEN 
     20 
     ELSE DF.days END as Day 
     files 
    FROM DayFile DF) SummaryTable 
Group By SummaryTable.Day 
+0

非常有帮助,我现在唯一遇到的情况是: 'Column'SummaryTable.TotalFiles'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中 – McVey 2010-05-21 20:20:46

+0

对不起,请检查第二个查询 – 2010-05-21 20:30:37

0

你是不清楚的范围是如何确定的(例如,如果您使用的是SQL Server 2005或更高版本,则可以得到如下结果:

With PeriodLength As 
    (
    Select DateDiff(d, OpenDate, CloseDate) As DiffDays 
    From Table 
    ) 
    , Ranges As 
    (
    Select Case 
      When DiffDays < 3 Then 'Less than 3 Days' 
      When DiffDays >= 3 And DiffDays < 10 Then 'Less than 10 Days' 
      When DiffDays >= 10 And DiffDays < 13 Then 'Less than 13 Days' 
      When DiffDays >= 13 And DiffDays < 20 Then 'Less than 20 Days' 
      When DiffDays >= 20 Then 'Greater than 20 days' 
      End As Range 
    From PeriodLength 
    ) 
Select Range 
    , Count(*) As FileCount 
    , Count(*) * 100.000/(Select Count(*) From Ranges) As Percentage 
From Ranges 
Group By Range 
“3天意味着< 3天,< = 3天,= 3天,> 3天或> = 3天?
+0

您也可以在这里使用BETWEEN更容易显示范围。<3可以,然后介于两者之间een来分割其他的范围,然后ELSE去捕获所有其他的(然后>你的最高范围) – cairnz 2010-11-22 22:10:00

+0

@cairnz - 我不是Of关键字的巨大粉丝,因为它并不表达会发生什么如使用'>'和'> ='。如果我写'10到20之间',读者必须知道这包括终点。而如果我写,'Foo> = 10和Foo <= 20',我很清楚我是否包括终点。 – Thomas 2010-11-22 22:31:28