【问题标题】:Top and Bottom in the same query?同一查询中的顶部和底部?
【发布时间】:2015-04-29 23:12:53
【问题描述】:

我需要制作一份 ssrs 报告,根据他们的花费来显示最好和最差的客户。在我的报告中,我想在一张图表中表示排名前 1 位和排名最低的客户之间的差距。我的问题是我不可能在同一个数据集/查询中获取这些值。 这是我的查询结果(见下面的代码)。我想,也许联合全部或其他东西,只从一个查询中得到相同的结果。或者有没有更简单的方法,例如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

【问题讨论】:

  • 为什么 UNION 不适合你?
  • SQL Server 的哪个版本?
  • 我会坚持使用 SQL 解决方案 - SSRS 过滤、表达式等可能无法满足此要求。

标签: sql tsql reporting-services


【解决方案1】:

联合运算符不喜欢 order by 子句,因此您可以稍微重组

  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

【讨论】:

  • TY!真的帮到我了。忘记了CTE。 :)
【解决方案2】:

您可以对这些查询进行 UNION,并将另一列“CustomerType”添加到具有值的查询 - TopCustomer 和 BottomCustomer 对应地区分客户类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多