Sql server 从不同类别中选择前n名

Sql server 从不同类别中选择前n名,sql-server,adventureworks,Sql Server,Adventureworks,因此,我想选择每季度、每年销量最高的前10种产品。季度为一年的四分之一。 例如: 年份->2017年 第一季度:销售产品前10名 SELECT s.ProductKey as [Key], COUNT(s.ProductKey) as [ProductVolume], datepart(q, s.OrderDate) as [Quarter],(yyyy, s.OrderDate) as [Year] FROM (Select p.ProductKey,

因此,我想选择每季度、每年销量最高的前10种产品。季度为一年的四分之一。 例如:

年份->2017年 第一季度:销售产品前10名

SELECT s.ProductKey as [Key],
    COUNT(s.ProductKey) as [ProductVolume],
    datepart(q, s.OrderDate) as [Quarter],(yyyy, s.OrderDate) as [Year]
FROM (Select p.ProductKey,
             s.OrderDate,
             row_number() over(PARTITION BY datepart(q, s.OrderDate)
                order by 
                p.ProductKey desc) as rn
      FROM Sales as s 
      INNER JOIN SalesProduct as sp
          ON sp.SalesKey=s.SalesKey
      INNER JOIN Product as p
          ON p.ProductKey=sp.ProductKey
      ) as s
WHERE datepart(yyyy, s.OrderDate) 
    BETWEEN YEAR(getdate())-2 AND YEAR(getdate())
GROUP BY datepart(q, s.OrderDate), datepart(yyyy, s.OrderDate), s.ProductKey
我想要这种输出:(where key->ProductKey,ProductVolume->该产品的销售计数,季度->相关季度的数量,年份->相关年份)

|关键|产量|季度|年度| .......

第二季度:销售产品前10名 ... 年份->2016年 第一季度:销售产品前10名 第二季度:销售产品前10名

SELECT s.ProductKey as [Key],
    COUNT(s.ProductKey) as [ProductVolume],
    datepart(q, s.OrderDate) as [Quarter],(yyyy, s.OrderDate) as [Year]
FROM (Select p.ProductKey,
             s.OrderDate,
             row_number() over(PARTITION BY datepart(q, s.OrderDate)
                order by 
                p.ProductKey desc) as rn
      FROM Sales as s 
      INNER JOIN SalesProduct as sp
          ON sp.SalesKey=s.SalesKey
      INNER JOIN Product as p
          ON p.ProductKey=sp.ProductKey
      ) as s
WHERE datepart(yyyy, s.OrderDate) 
    BETWEEN YEAR(getdate())-2 AND YEAR(getdate())
GROUP BY datepart(q, s.OrderDate), datepart(yyyy, s.OrderDate), s.ProductKey
这是我现在得到的结果,所有的结果

上图表示此查询的结果,即我在内部联接中使用的表的布局

Select top 1 * from Product;
  Select top 1 * from Sales;
  Select top 1 * from SalesProduct;

按每季度+每年每种产品的销售价值订购

DECLARE @Sales TABLE (
    SalesKey INT,
    OrderDate DATETIME
)

DECLARE @SalesProduct TABLE (
    SalesKey INT,
    ProductKey INT,
    UnitPrice MONEY,
    OrderQuantity TINYINT
)

INSERT INTO @Sales(SalesKey,OrderDate) SELECT 1, '2018-05-18'
INSERT INTO @Sales(SalesKey,OrderDate) SELECT 2, '2018-05-18'

INSERT INTO @SalesProduct(SalesKey,ProductKey,UnitPrice,OrderQuantity) SELECT 1,123,3.50,1
INSERT INTO @SalesProduct(SalesKey,ProductKey,UnitPrice,OrderQuantity) SELECT 1,125,3.50,1
INSERT INTO @SalesProduct(SalesKey,ProductKey,UnitPrice,OrderQuantity) SELECT 2,123,2.50,5

SELECT *
FROM (
    Select
        datepart(year, s.OrderDate) AS [Year],
        datepart(q, s.OrderDate) AS [Quarter],
        sp.ProductKey,
        sum(sp.OrderQuantity) AS [TotalOrdered],
        sum(sp.UnitPrice * sp.OrderQuantity) AS [TotalValue],
        row_number() over(PARTITION BY datepart(year, s.OrderDate),datepart(q, s.OrderDate) order by sum(sp.OrderQuantity) desc) as [Row]
    FROM @Sales as s 
    INNER JOIN @SalesProduct as sp ON sp.SalesKey=s.SalesKey
    WHERE datepart(yyyy, s.OrderDate) BETWEEN YEAR(getdate())-2 AND YEAR(getdate())
    GROUP BY datepart(year, s.OrderDate),datepart(q, s.OrderDate),sp.ProductKey
) dat
WHERE dat.[Row]<=10
DECLARE@Sales表(
SalesKey INT,
订单日期时间
)
声明@SalesProduct表(
SalesKey INT,
ProductKey INT,
单价货币,
订购数量罐头
)
在@Sales(SalesKey,OrderDate)中插入选择1,'2018-05-18'
在@Sales(SalesKey,OrderDate)中插入选择2,“2018-05-18”
插入@SalesProduct(SalesKey、ProductKey、单价、订单数量)选择1123,3.50,1
插入@SalesProduct(SalesKey、ProductKey、单价、订单数量)选择1125,3.50,1
插入@SalesProduct(SalesKey、ProductKey、单价、订单数量)选择2123,2.50,5
挑选*
从(
挑选
日期部分(年,s.OrderDate)为[年],
日期部分(q,s.OrderDate)为[季度],
sp.ProductKey,
总和(sp.OrderQuantity)为[TotalOrdered],
总和(sp单价*sp订单数量)为[TotalValue],
行(按datepart(年份,s.OrderDate)划分)、datepart(q,s.OrderDate)按和(sp.OrderQuantity)描述划分为[行]
来自@Sales as s
sp.SalesKey=s.SalesKey上的内部连接@salessproduct作为sp
其中datepart(yyyy,s.OrderDate)介于年(getdate())-2和年(getdate())之间
按datepart(年份,s.OrderDate)、datepart(q,s.OrderDate)、sp.ProductKey分组
)dat

WHERE dat.[Row]前10名的衡量标准是什么?我看到的唯一顺序是ProductKey,但这与前10名没有多大意义(除非你想看看最新的10个产品在历史上的表现)。另外,我可以问一下,当您可以键入
年份时,为什么还要麻烦键入
yyy
?还有,SQL Server的哪个版本?您是否可以通过只计算行来真正衡量销售额?您的销售表是否没有数量列?或者如果有人购买了6种相同的产品,您会在销售表中插入6行?SQL Server版本是Microsoft SQL服务器2017(RTM)-14.0.1000.169,我编辑了这个问题,以便更具体地说明问题是什么以及我想说什么