Расчет накопительного количества в SQL Server - PullRequest
0 голосов
/ 16 января 2010

Скажите, если у меня есть таблица с 2 столбцами - ID, деньги. Я хочу сделать запрос, чтобы узнать, сколько у ID денег меньше 100, 200, 300, ..., 10000 Как я должен сделать это в SQL Server? Нужно ли использовать переменные?

Ответы [ 3 ]

1 голос
/ 16 января 2010

Предполагая, что id является ключевым столбцом, попробуйте это:

Select Case When money < 100 Then 'LT100'
            When money < 200 Then 'From100To199'
            When money < 300 Then 'From200To299'
            When money < 1000 Then 'From300To999'
                              Else 'GE1000' End Bucket, 
       Count(*) Count
From Table
Group By Case When money < 100 Then 'LT100'
            When money < 200 Then 'From100To199'
            When money < 300 Then 'From200To299'
            When money < 1000 Then 'From300To999'
                              Else 'GE1000' End  

EDIT: Если длина или размер сегментов является константой (или может быть представлена ​​как выражение SQL), то вы можете сделать любое произвольное количество сегментов, определив сегменты как выходные данные этого выражения, как, например, для определенного каждые 100 долларов США:

Select Str(Floor(Cast(money / 100)), 8, 0)  Bucket, 
       Count(*) Count
From Table
Group By  Str(Floor(Cast(money / 100)), 8, 0)

или, чтобы иметь 100 долларовых ведер до 1000 долларов, а затем 1000 долларов, начиная с:

Select Case When Money < 1000 
            Then  Str(Floor(Cast(money / 100)), 8, 0) 
            Else Str(Floor(Cast(money / 1000)), 8, 0) End  Bucket, 
       Count(*) Count
From Table
Group By Case When Money < 1000 
            Then  Str(Floor(Cast(money / 100)), 8, 0) 
            Else Str(Floor(Cast(money / 1000)), 8, 0) End 

чтобы получить накопленные значения, я бы использовал вывод указанных выше SQL-запросов в качестве подзапроса в другом SQL: Используя первый пример:

  Select LT100,
         LT100 + From100To199 LT200,
         LT100 + From100To199 + From200To299  LT300,
         LT100 + From100To199 +  From200To299 + From300To999  LT1000,
         LT100 + From100To199 +  From200To299 + From300To999 + GE1000 Total     
  From ( Select Case When money < 100 Then 'LT100'
                When money < 200 Then 'From100To199'
                When money < 300 Then 'From200To299'
                When money < 1000 Then 'From300To999'
                                  Else 'GE1000' End Bucket, 
           Count(*) Count
         From Table
         Group By Case When money < 100 Then 'LT100'
                When money < 200 Then 'From100To199'
                When money < 300 Then 'From200To299'
                When money < 1000 Then 'From300To999'
                                  Else 'GE1000' End) Z
0 голосов
/ 17 января 2010

Иногда проще всего использовать цикл в хранимой процедуре:

CREATE TABLE #tmp0(
bucket int,
accumulator int,
)

/* for(n = maxvalue; n > 0; n -= 100) */

Declare @n int
select @n = (select 100 + (100 * (max(moneyField) / 100)) from tbl)
while @n > 0
begin
    insert into #tmp0 (bucket, accumulator) 
        (select @n, count(*) from tbl where moneyField < @n)
    select @n = @n - 100
end
select * from #tmp0 order by bucket

drop table #tmp0
0 голосов
/ 16 января 2010
SELECT
     SUM(CASE WHEN MONEY < 100 THEN 1 ELSE 0 END AS '0-100'
    ,SUM(CASE WHEN MONEY >= 100 AND MONEY < 200 THEN 1 ELSE 0 END AS '100-200'
    ,SUM(CASE WHEN MONEY >= 200 AND MONEY < 300 THEN 1 ELSE 0 END AS '200-300'
FROM
    Table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...