В следующем запросе я использую функцию NTILE
, чтобы сгруппировать результат по разнице в процентах. Я никогда не использовал эту функцию раньше, но мне было интересно, есть ли способ «определить», какой диапазон процентов go в каких процентилях - то есть я бы определил квартиль '4', например, как 10 - 90 процентов. Может быть, это неправильная функция для использования здесь? Любая помощь будет отличной. Обратите внимание, что на самом деле в предложении WHERE
содержится на TON больше материалов, чем указано здесь - это только для примера.
Спасибо.
Запрос:
WITH NonExcessCTE (MATERIAL, SIZE_LITERAL, TOTAL_SIZE, TOTAL_MATERIAL, SIZE_PERCENT)
AS (
SELECT DISTINCT MATERIAL, SIZE_LITERAL,
SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) AS TOTAL_SIZE,
SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS TOTAL_MATERIAL,
100.0 * SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) /
SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS SIZE_PERCENT
FROM VW_MRP_ALLOCATION_COMBINED
WHERE REQUIREMENT_TYPE <> ''
AND STOCK_CATEGORY <> 'A60386045'
),
ExcessCTE (MATERIAL, SIZE_LITERAL, TOTAL_SIZE, TOTAL_MATERIAL, SIZE_PERCENT)
AS (
SELECT DISTINCT MATERIAL, SIZE_LITERAL,
SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) AS TOTAL_SIZE,
SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS TOTAL_MATERIAL,
100.0 * SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) /
SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS SIZE_PERCENT
FROM VW_MRP_ALLOCATION_COMBINED
WHERE REQUIREMENT_TYPE = ''
AND STOCK_CATEGORY <> 'A60386045'
)
SELECT E.MATERIAL,
E.SIZE_LITERAL,
E.TOTAL_SIZE,
ROUND(E.SIZE_PERCENT,0) AS 'EXCESS_SIZE_PERCENT',
ROUND(N.SIZE_PERCENT,0) AS 'NON_EXCESS_SIZE_PERCENT',
ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0) AS 'DIFFERENCE',
NTILE(4) OVER(ORDER BY ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0)) AS 'QUARTILE'
FROM NonExcessCTE N JOIN ExcessCTE E ON N.MATERIAL = E.MATERIAL AND N.SIZE_LITERAL = E.SIZE_LITERAL
WHERE N.MATERIAL IN ('EE4726',
'EE4726',
'EE4727')
ORDER BY ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0) DESC