2016-01-21 2 views
0

Добрый день!Заявление о ситуации в разделе Where в SQL Server

У меня есть запрос с использованием SQL, который дает результирующий набор продаж для каждого арендатора. Теперь я хочу получить окончательный набор результатов, который показывает верхние 5 и нижние 5 с точки зрения продаж (может быть гибким, но, как пример, 5)

Я использовал функцию рангов, чтобы получить рейтинг за продажи, и смог получить почти желаемый результат, отобразив верхнего и нижнего арендаторов на основе продаж.

Вот часть кода из хранимой процедуры

@RankedBy int = 5 

SELECT *FROM (
      SELECT #TEMPTABLE5.*, 'BOTTOM' AS 'RankName' , 
        Rank() over (Partition BY Business ORDER BY Sales) AS Rank 
        FROM #TEMPTABLE5 
      ) rs WHERE Rank <= @RankedBy 

UNION ALL 

SELECT *FROM (
      SELECT #TEMPTABLE5.*, 'BOTTOM' AS 'RankName' , 
        Rank() over (Partition BY Business ORDER BY Sales DESC) AS Rank 
        FROM #TEMPTABLE5 
      ) rs WHERE Rank <= @RankedBy 

order by Business, RankName DESC ,Rank  

и это результирующий набор

tenant  business sales rankName rank 
sample A1 food  1500 top   1 
sample A2 food  1400 top   2 
sample A3 food  1300 top   3 
sample A4 food  1200 top   4 
sample A5 food  1100 top   5 
sample A6 food   100 bottom   1 
sample A7 food   200 bottom   2 
sample A8 food   300 bottom   3 
sample A9 food   400 bottom   4 
sample A10 food   500 bottom   5 
sample B1 non food 2000 top   1 
sample B2 non food 1800 top   2 
sample B3 non food 1500 top   3 
sample B3 non food 1500 bottom   1 
sample B2 non food 1800 bottom   2 
sample B1 non food 2000 bottom   3 

Основываясь на данной информации, я уже достиг, чтобы получить верхнюю и снизу на основе NUMBER ASSIGNED IN @RankedBy Parameter.

ЧТО я хочу сейчас, чтобы иметь условие, при котором, если результат установлен в бизнес НИЖЕ ИЛИ МЕНЕЕ ПОКАЗАТЕЛЯ @RankedBy, результат больше не должен включать в себя нижнюю часть, как этот образец корректный результат:

tenant  business  sales rankName  rank 
    sample A1 food  1500 top   1 
    sample A2 food  1400 top   2 
    sample A3 food  1300 top   3 
    sample A4 food  1200 top   4 
    sample A5 food  1100 top   5 
    sample A6 food   100 bottom   1 
    sample A7 food   200 bottom   2 
    sample A8 food   300 bottom   3 
    sample A9 food   400 bottom   4 
    sample A10 food   500 bottom   5 
    sample B1 non food 2000 top   1 
    sample B2 non food 1800 top   2 
    sample B3 non food 1500 top   3 

не еда имеет 3 записи только, меньше параметра, назначенного в @RankedBy, который 5.

на моем существующем коде, что я планировал это иметь счета за бизнес и положить условие в where where, но я нашел его в эффективным и неэффективным.

Если кто-либо из вас может дать более эффективное кодирование или может исправить мои первоначальные коды.

СПАСИБО ЗАРАНЕЕ

ответ

0

Я хотел бы создать временную таблицу с результатом полного запроса, а затем сделать два простых запросов с ORDER BY sales LIMIT 5 и ORDER BY sales DESC LIMIT 5.

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

+0

вы можете дать мне пример кода сэр? – rickyProgrammer

+0

Давайте посмотрим, смогу ли я получить синтаксис в первый раз: 'CREATE TEMP TABLE foo (арендатор TEXT, бизнес-ТЕКСТ, продажа INTEGER, rankName TEXT, rank INTEGER); INSERT INTO foo SELECT ... как и вы; SELECT * из заказа foo по лимиту продаж 5; ' – manuBriot

+0

LIMIT - это mysql I beleive. Для SQL Server 'SELECT TOP 5' и т. Д. –

0

вы добавляете, имеющий в нижней части, как этот

@RankedBy int = 5 

    SELECT *FROM (
     SELECT #TEMPTABLE5.*, 'TOP' AS 'RankName' , 
       Rank() over (Partition BY Business ORDER BY Sales) AS Rank 
       FROM #TEMPTABLE5 
     ) rs WHERE Rank <= @RankedBy 

    UNION ALL 

    SELECT tenant,business,sales,rankName,rank FROM (
     select tenant,business,sales,rankName,rank,max(rank) from(
     SELECT #TEMPTABLE5.*, 'BOTTOM' AS 'RankName' , 
       Rank() over (Partition BY Business ORDER BY Sales DESC) AS Rank 
       FROM #TEMPTABLE5 
     ) rs WHERE Rank <= @RankedBy)rk 
    group by tenant,business,sales,rankName,rank Having MAX(Rank) = @RankedBy 

order by Business, RankName DESC ,Rank  
+0

Я попробую это. – rickyProgrammer

+0

привет @raffaello это не работает. – rickyProgrammer

Смежные вопросы