Вопрос T-SQL - Подсчет и Средний - PullRequest
1 голос
/ 21 мая 2010

У меня есть набор данных, который состоит из filenbr, даты открытия и даты закрытия.

Мне нужно составить сводную таблицу, аналогичную приведенной ниже, мне нужно подсчитать, сколько файлов принадлежит каждому дневному периоду, но мне нужно, чтобы их было больше 20, сгруппированных вместе. Я знаю, как получить датировку, на что я натыкаюсь, как получить 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%

Ответы [ 2 ]

1 голос
/ 21 мая 2010

предположим, что у вас есть таблица с именем 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 голосов
/ 22 мая 2010

Вам неясно, как определяются диапазоны (например, означает ли «3 дня <3 дня, <= 3 дня, = 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...