【问题标题】:T-SQL Question - Counting and AverageT-SQL 问题 - 计数和平均
【发布时间】:2010-11-23 04:30:26
【问题描述】:

我有一组数据,其中包含 filenbr、打开日期和关闭日期。

我需要生成一个类似于下面的汇总表,我需要计算每天有多少文件属于,但我需要将大于 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%

【问题讨论】:

  • “3 天”是指开盘日期和收盘日期之间的差正好是 3 天,最多 3 天还是至少 3 天?

标签: sql sql-server tsql


【解决方案1】:

假设您有一个名为 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

【讨论】:

  • 非常有帮助,我现在遇到的唯一问题是:'Column 'SummaryTable.TotalFiles' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
  • 对此感到抱歉。检查第二个查询。
【解决方案2】:

您不清楚范围是如何确定的(例如,“3 天是否意味着 3 天或 >= 3 天?)。如果您使用的是 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

【讨论】:

  • 您也可以在此处使用 BETWEEN 来更轻松地显示范围。 你的最高范围)
  • @cairnz - 我不是 Between 关键字的忠实拥护者,因为它不像使用 &gt;&gt;= 那样清楚地表达会发生什么。如果我写Between 10 and 20,读者必须知道这包括端点。而如果我写,Foo &gt;= 10 And Foo &lt;= 20 很明显我是否包括端点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多