Поместить данные в диапазоны по параметру - PullRequest
0 голосов
/ 21 марта 2019

У меня есть такие данные:

FIELD_ID | Acreage | Association
017-8596 | 1.2589  | ABC
017-8521 | 25.89   | CDA

Я хотел бы сначала получить количество полей в диапазоне Acreage с:

1-10
11-25
26-50
51-100
100-500

Тогда получите тот же диапазон, но на Association.

Результат должен быть таким:

Acreage Range | Number of Fields
1-10          | 200
11-25         | 670
25-50         | 12

Etc

Первый результат должен сопровождаться запросом для всех Association с, тогда как другой результат должен быть результатом по отдельным Association.

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

Вы можете использовать подзапрос UNION ed для объявления серии диапазонов, а затем JOIN таблицу с ним, используя агрегирование для подсчета количества вхождений:

SELECT
    CONCAT(r.lbound, '-', r.ubound) Acreage_Range, 
    COUNT(*) Number_of_Fields
FROM
    mytable t
    INNER JOIN (
        SELECT 1 lbound, 10 ubound
        UNION ALL SELECT 11, 25
        UNION ALL SELECT 26, 50
        UNION ALL SELECT 51, 100
        UNION ALL SELECT 101, 500
    ) ranges r
    ON t.acreage >= r.lbound AND t.acreage <= r.ubound
GROUP BY r.lbound, r.ubound

Если вам нужно отфильтровать результаты для данного Association, то вы можете просто добавить к запросу предложение WHERE.

0 голосов
/ 21 марта 2019

Я пробовал это и получал результаты, но мне было интересно, почему я получаю недопустимую площадь, если ни одна из моих строк недействительна и у всех есть данные.Есть идеи, что может вызвать это?

     WITH AcreageData as
(
  SELECT [FIELD_ID], 
     [ASSN],
     [ACREAGE] AS ACREAGE
  FROM dbo.CaneParcel    


),
GroupAcreage AS
(
  SELECT [FIELD_ID],      
     CASE                      
         WHEN ACREAGE <= 0.50 THEN '< 0.5 Acre'
         WHEN ACREAGE >= 0.50 AND ACREAGE <= 1.01 THEN '0.5 - 1 Acre'
         WHEN ACREAGE >= 1.01 AND ACREAGE <= 10.01 THEN '1 - 10 Acres'
         WHEN ACREAGE >= 10.01 AND ACREAGE <= 25.01 THEN '10 - 25 Acres'         
         WHEN ACREAGE >= 25.01 AND ACREAGE <= 50.01 THEN '25 - 50 Acres'
         WHEN ACREAGE BETWEEN 51.01 AND 100 THEN '51 - 100 Acres'
         WHEN ACREAGE BETWEEN 101 AND 200 THEN '101 - 200 Acres'
         WHEN ACREAGE BETWEEN 201 AND 300 THEN '201 - 300 Acres'         
         WHEN ACREAGE > 1000 THEN '1000 and Over'
         ELSE 'Invalid Acreage'
     END AS [Acreage Groups]
  FROM AcreageData
)
SELECT
[Acreage Groups],
COUNT([FIELD_ID]) as NumberofParcels   
FROM GroupAcreage
GROUP BY [Acreage Groups]
ORDER BY [Acreage Groups] ASC;
0 голосов
/ 21 марта 2019
    select qq.range_id,
           count(distinct of qq.field_id or qq.assocuation)
    from
    (
        select <all of your fields>,
               case 
                  when .... '1-10'
                  when .... '11-20'
               end range_id
        from ...
    ) qq
    group by qq.range_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...