получить определенную запись, в то время как сумма предыдущих записей больше, чем в процентах в SQL Server - PullRequest
2 голосов
/ 01 сентября 2011

Таблица: FooData

ID   Count
1    54
2    42
3    33
4    25
5    16
6    9
8    5
9    3
10   2

Я хочу получить запись о том, что сумма столбца Count больше определенного процента, например 90.

В этом примере сумма всех записей равна 189, а 90% - 170,1; мы видим, что сумма от 1 до 6 равна 179, и она больше 170,1, поэтому идентификатор 6 должен быть вернулся.

Кстати, временная таблица не разрешена, потому что мне нужно сделать это в функции.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Еще одна версия треугольного соединения.

declare @T table(ID int primary key, [Count] int)
insert into @T values (1, 54), (2, 42), (3, 33),(4, 25), (5, 16), (6, 9), (8, 5), (9, 3),(10, 2)

;with R(ID, [Count], Running) as
(
  select T1.ID, 
         T1.[Count],
         cast(T3.[Count] as float)
  from @T as T1
    cross apply (select sum(T2.[Count])
                 from @T as T2
                 where T1.ID >= T2.ID) as T3([Count])
),
T(Total) as
(
  select sum([Count])
  from @T
)
select top 1 R.ID, R.[Count], R.Running
from R
  inner join T
    on R.Running / T.Total > 0.9
order by R.ID
1 голос
/ 01 сентября 2011

Попробуйте это:

SELECT TOP 1 
  t2.id,
  SUM(t1.value) AS runningTotal
FROM FooData t1 
INNER JOIN FooData t2 
  ON t1.id <= t2.id 
GROUP BY t2.id
HAVING SUM(t1.value) * 100. / 
  (SELECT SUM(value) FROM @FooData) > 90
ORDER BY SUM(t1.value)

Но также следует учитывать потенциальную проблему производительности с треугольными объединениями в промежуточных итогах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...