Мне нужно возвращать записи, основываясь на том, что их "Процент от общего количества". Так, например, я мог бы захотеть узнать «Топ 10% продаж по клиенту».
В настоящее время я использую это:
SELECT * FROM (SELECT Dim1, SUM(SQ_Fact1) AS Fact1,
(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl
FROM (SELECT Customer AS Dim1, SUM(Sales) AS SQ_Fact1
FROM SalesHistory GROUP BY Customer) AS sq
GROUP BY Dim1) AS mq
WHERE PctOfTtl<=0.10
Это немного слишком сложно , но это часть пользовательского интерфейса для построения запросов, поэтому он создает подзапрос и «основной» внешний запрос для всех запросов (по причинам, не связанным с этим), а затем должен использовать другой внешний запрос для проверки PctOfTtl. Независимо от этого, строка, которая получает совокупный процент от общего количества (и сортирует его по убыванию, так что я могу получить "верхние" записи):
(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl
И затем во внешнем запросе я ограничиваю, какой процент Всего я возвращаюсь, говоря: «ГДЕ PctOfTtl <= 0.10» </p>
Проблема в том, что PctOfTtl сообщает мне, где заканчивается их процент от общего количества, а не где он начинается.
Итак, допустим, верх Клиент составляет 15% от продаж. Он будет иметь PctOfTtl 0,15. Проблема заключается в том, что если пользователь запрашивает клиентов в 10% лучших продаж (<= 0,1), он не возвращает никаких записей, поскольку самый верхний клиент не «заканчивается» до 0,15, поэтому его PctOfTtl не будет быть <= 0,1. Мне нужно знать, где начинается их процент от общего количества (т. Е. Самый верхний клиент будет начинаться с 0, а второй - с 0,15 и т. Д. c). Что я действительно ищу, так это любых клиентов, чей процент от общего «диапазона» падает где-то в процентах, которые пользователь указывает (даже если он выходит за его пределы). </p>
Проблема, как я уже сказал, заключается в следующем для пользовательского интерфейса построения запросов, поэтому я не могу полностью реструктурировать запрос, чтобы сделать это. Он должен работать в рамках существующего формата «подзапрос / основной запрос», что и при использовании предложения «OVER». Я могу просто проверить, используют ли они фильтр «Top%», и, если это так, добавить столбец PctOfTtl и окружить запрос внешним запросом, ограничивающим PctOfTtl. По сути, я надеюсь найти способ использовать OVER (), который скажет мне, что такое PctOfTtl за вычетом PctOfTtl «до».