Лучший способ найти номер счета в определенных диапазонах значений - PullRequest
0 голосов
/ 09 мая 2018

У меня проблемы с тем, что было бы лучшим / наиболее эффективным способом найти все учетные записи, попадающие в определенный диапазон значений, без 20 различных вариантов выбора.

Так, например, мне нужно найти следующее:

Account Value    Number of plans     average value
$100-$10000      
$11000-$15000
$16000-$20000
$21000-$30000
$30000+

Итак, сейчас мой запрос в основном такой для каждого диапазона значений:

    SELECT COUNT (acct) AS 'Number of Plans'
     , AVG (Value) AS 'Average Value'
   FROM #RT1
  WHERE Value
        BETWEEN 0 AND 249999.99
        AND InstaCode = 'S'

, и в SSRS необходимо заполнить три разных диаграммы.Единственный способ понять это - написать 15 различных утверждений, но я чувствую, что должен быть более простой и эффективный способ сделать это.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Мне нравится использовать cross apply для этого:

SELECT v.grp, COUNT(acct) AS num_plans, AVG(value) as avg_value
FROM #RT1 t CROSS APPLY
     (VALUES (CASE WHEN value >= 100 and value < 10000 THEN '$100-$10000'
                   WHEN value < 15000 THEN '$11000-$15000'
                   WHEN value < 20000 THEN '$16000-$20000'
                   WHEN value < 30000 THEN '$21000-$30000'
                   ELSE '$30000+'
              END) as grp
     ) v(grp)
GROUP BY v.grp;

Я не уверен, что InstaCode = 'S' имеет отношение к результатам. Его достаточно легко добавить либо к выражению CASE, либо к предложению WHERE.

0 голосов
/ 09 мая 2018
SELECT 
Case 
    When Value between 100 and 10000 Then '100 to 10000'
    When Value between 11000 and 15000 Then '11000 to 15000'
    When Value between 16000 and 20000 Then '16000 to 20000'
    When Value between 21000 and 30000 Then '21000 to 30000'
    When Value > 30000 Then '30000+'
End as AccountValue 
  COUNT (acct) AS NumberofPlans
 , AVG (Value) AS AverageValue
FROM #RT1
WHERE Value
    BETWEEN 0 AND 249999.99
    AND InstaCode = 'S'

Group by 
Case 
 When Value between 100 and 10000 Then '100 to 10000'
 When Value between 11000 and 15000 Then '11000 to 15000'
 When Value between 16000 and 20000 Then '16000 to 20000'
 When Value between 21000 and 30000 Then '21000 to 30000'
 When Value > 30000 Then '30000+'
End
0 голосов
/ 09 мая 2018

Использовать условное агрегирование для каждой группы:

          SELECT COUNT (case when Value
                BETWEEN 0 AND 249999.99
                 then value else null end) AS 'Number of Plans group 1',
COUNT (case when Value
                BETWEEN 2500000  AND 3000000
                 then value else null end) AS 'Number of Plans group 2',

                  AVG (case when Value
                    BETWEEN 0 AND 249999.99
                     then value else null end) AS 'Average Value 1st group', AVG (case when Value
                    BETWEEN 2500000 AND 3000000
                     then value else null end) AS 'Average Value 2nd group'...
    from #RT1
    where instacode='s'
...