2015-04-29 5 views
2

Мне нужно сделать отчет ssrs, который показывает лучшего и худшего клиента в зависимости от того, сколько они потратили. В моем отчете я хотел бы представить разрыв между клиентом Top 1 и Bottom в пределах одного графика. Моя проблема в том, что для меня невозможно получить эти значения в одном наборе данных/запроса. Это мои результаты запроса (см. Код ниже). Я хотел бы, с возможно объединением все или что-то, получить тот же результат только от одного запроса. Или существует более простой способ, например, Visual Studio для представления этих значений. Вероятнее всего, могут быть N-верхние, нижние N-фильтры? Если да, пожалуйста, покажите мне способ или «лучшую практику», потому что я еще не понял этого. спасибо.Верх и низ в том же запросе?

Код:

SELECT DISTINCT TOP 1 
     dimcustomer.FirstName , 
     SUM(FactInternetSales.OrderQuantity * UnitPrice) 
FROM DimCustomer 
     INNER JOIN FactInternetSales ON FactInternetSales.CustomerKey = DimCustomer.CustomerKey 
GROUP BY FirstName 
ORDER BY SUM(FactInternetSales.OrderQuantity * UnitPrice) DESC 

SELECT DISTINCT TOP 1 
     dimcustomer.FirstName , 
     SUM(FactInternetSales.SalesAmount) 
FROM DimCustomer 
     INNER JOIN FactInternetSales ON FactInternetSales.CustomerKey = DimCustomer.CustomerKey 
GROUP BY FirstName 
ORDER BY SUM(FactInternetSales.SalesAmount) DESC 

Два набора результатов:

   FirstName | SalesAmount 
       Morgan  145044,5816 

       ------------------------ 

       FirstName | SalesAmount 
       Dave   3.99 
+1

Почему UNION не работает на вас? – cha

+0

Какая версия SQL Server? – jpw

+0

SQL Server 2014 – Blixter

ответ

3

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

with CustomersOrders as 
    (
    select dimcustomer.FirstName, sum(FactInternetSales.OrderQuantityUnitPrice) Total 
     from DimCustomer 
     inner join FactInternetSales on FactInternetSales.CustomerKey = DimCustomer.CustomerKey 
     group by FirstName 
) 
    select * 
    from 
    (
    select top 1 * 
     from CustomersOrders 
     order by Total desc 
    ) a 
    union all 
    select * 
    from 
    ( 
    select top 1 * 
     from CustomersOrders 
     order by Total 
    ) b 
+0

TY! Действительно помог мне здесь. Забыл о CTE. :) – Blixter

0

Вы можете UNION эти запросы и добавить еще один столбец «CustomerType» к запросам со значениями - TopCustomer & BottomCustomer, соответственно, чтобы различать тип клиента.