Как добавить два столбца счетчика в набор результатов, если один счет не ограничен аргументами в предложении WHERE? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытался написать SQL-запрос, который вернул бы набор данных с несколькими прикрепленными строками подсчета. В этом случае я хочу вернуть список ФРУКТОВ, которые ЗАГЛУШЕНЫ в 2018 году. Затем я хотел бы добавить столбец, в котором подсчитывается количество ПОВРЕЖДЕННЫХ ФРУКТОВ, найденных в 2018 году. Затем еще один столбец, который подсчитывает общее количествострок FRUIT, по типу, для года 2018.

Итак, учитывая следующую таблицу

FRUIT    DEFECT    YEAR    ...
------------------------------
APPLE    ROTTEN    2017
APPLE    ROTTEN    2018
APPLE    ROTTEN    2018
APPLE    BUGS      2018
APPLE    ROTTEN    2018
APPLE    BUGS      2018
APPLE    BITTEN    2018
APPLE    BITTEN    2017
ORANGE   BITTEN    2018
ORANGE   ROTTEN    2018

Я хотел бы получить следующий результат,

FRUIT    DEFECT    YEAR    DEFECTCOUNT    FRUITCOUNT
----------------------------------------------------
APPLE    ROTTEN    2018    3              6           
ORANGE   ROTTEN    2018    1              2

но проблема в том, что когда я ограничиваю оператор where поиском определенного DEFECT, я не могу получить итоговое значение для типа FRUIT за этот год.

Вот мой запрос на данный момент

SELECT   DISTINCT FRUIT
        , Defect
        , YEAR([Date]) As [YR]
        , COUNT(Defect) AS [DEFECTCOUNT] -- This returns correctly
        --, COUNT(*) AS [FRUITCOUNT] -- does return the correct number
FROM [dbo].[A_DETAIL_REPOS] dat
WHERE YEAR(dat.[Date]) >= '2018'
AND YEAR(dat.[Date]) <= '2018'
AND dat.Defect = 'ROTTEN'
GROUP BY FRUIT, Year([Date]), Defect
ORDER BY YEAR([Date])

Спасибо за помощь,

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

ИСПОЛЬЗУЙТЕ условное COUNT(), чтобы получить число rotten.

SELECT    FRUIT
        --, Defect you only want 'ROTTEN' so you dont need this one
        , YEAR([Date]) As [YR]
        , COUNT( CASE WHEN Defect = 'ROTTEN' THEN 1 END ) AS [DEFECTCOUNT]
        , COUNT(*) AS [FRUITCOUNT] 
FROM [dbo].[A_DETAIL_REPOS] dat
WHERE YEAR(dat.[Date]) = '2018'
GROUP BY YEAR([Date]), FRUIT
1 голос
/ 05 ноября 2019

Вы хотите условную агрегацию. Однако я хочу призвать вас использовать сравнения дат для фильтрации:

SELECT FRUIT, YEAR([Date]) As [YR],
       SUM(CASE WHEN Defect = 'ROTTEN' THEN 1 ELSE 0 END) as num_rotten,
       COUNT(*) as num_total
FROM [dbo].[A_DETAIL_REPOS] dat
WHERE r.[Date] >= '2018-01-01' AND
      r.[Date] < '2019-01-01'
AND dat.Defect = 'ROTTEN'
GROUP BY FRUIT, Year([Date])
ORDER BY YEAR([Date]);

Прямые сравнения дат упрощают оптимизатору создание наилучшего плана запросов. В частности, он позволяет при необходимости использовать индекс.

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