Select 价格组内按季度的最畅销产品 ID
Select Top Selling ProductID By Quarter Within Price Group
我有这个查询:
WITH product_grouped AS (
SELECT
p.uniqueid,
cost,
case WHEN cost <= 10 THEN '0-10'
WHEN cost > 10 AND cost <= 25 THEN '10 < Price <= 25'
WHEN cost >= 25 and cost <= 100 THEN '25 < Price <= 100'
ELSE 'Price > 100' end AS price_group
FROM mmc..product p
),
quarters_grouped AS (
SELECT
uniqueid,
unitprice,
quantity,
cart_orderdate,
case WHEN c.cart_orderdate >= DATEADD(QUARTER, -1, getdate()) THEN 'Q1'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -2, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -1, getdate())THEN 'Q2'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -3, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -2, getdate())THEN 'Q3'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -4, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -3, getdate())THEN 'Q4'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -5, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -4, getdate())THEN 'Q5'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -6, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -5, getdate())THEN 'Q6'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -7, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -6, getdate())THEN 'Q7'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -8, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -7, getdate())THEN 'Q8'
end AS quarters
FROM omc..cart c
WHERE c.cart_orderdate > '2018-01-01'
),
sum_by_quarter AS (
SELECT pg.uniqueid, price_group, quarters, SUM(unitprice * quantity) AS total_sold
FROM product_grouped pg
INNER JOIN quarters_grouped qg
ON pg.uniqueid = qg.uniqueid
GROUP BY pg.uniqueid, price_group, quarters
),
partition_five AS (
SELECT quarters, price_group, uniqueid, total_sold, ROW_NUMBER() OVER (PARTITION BY quarters, price_group ORDER BY total_sold DESC) AS RowNo
FROM sum_by_quarter
)
SELECT *
FROM partition_five
WHERE RowNo <= 5
ORDER BY quarters, price_group, total_sold desc
我想知道过去 8 个季度中不同价格范围的产品的前 5 个销售产品 ID。其中最畅销的定义为来自购物车 table 的 unitprice * quantity
。价格区间为 Cost <= , 10 < Cost <= 25, 25 < Cost <= 100, Cost < 100
。我的查询给了我想要的东西,但是有没有更简单的方法可以在没有所有 case 语句的情况下做到这一点?
考虑根据日期差异计算季度差异。
'Q' + CONVERT(VARCHAR(5), CEILING(DATEDIFF(day, c.cart_orderdate, getdate()) / 91) + 1)
具体在 quarters_grouped CTE 中:
...
quarters_grouped AS (
SELECT
uniqueid,
unitprice,
quantity,
cart_orderdate,
'Q' + CONVERT(VARCHAR(5), CEILING(DATEDIFF(day, c.cart_orderdate, getdate()) / 91) + 1) AS quarters
FROM omc..cart c
WHERE c.cart_orderdate > '2018-01-01'
),
...
Rextester Demo (日期随机)
我有这个查询:
WITH product_grouped AS (
SELECT
p.uniqueid,
cost,
case WHEN cost <= 10 THEN '0-10'
WHEN cost > 10 AND cost <= 25 THEN '10 < Price <= 25'
WHEN cost >= 25 and cost <= 100 THEN '25 < Price <= 100'
ELSE 'Price > 100' end AS price_group
FROM mmc..product p
),
quarters_grouped AS (
SELECT
uniqueid,
unitprice,
quantity,
cart_orderdate,
case WHEN c.cart_orderdate >= DATEADD(QUARTER, -1, getdate()) THEN 'Q1'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -2, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -1, getdate())THEN 'Q2'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -3, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -2, getdate())THEN 'Q3'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -4, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -3, getdate())THEN 'Q4'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -5, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -4, getdate())THEN 'Q5'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -6, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -5, getdate())THEN 'Q6'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -7, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -6, getdate())THEN 'Q7'
WHEN c.cart_orderdate >= DATEADD(QUARTER, -8, getdate()) and c.cart_orderdate < DATEADD(QUARTER, -7, getdate())THEN 'Q8'
end AS quarters
FROM omc..cart c
WHERE c.cart_orderdate > '2018-01-01'
),
sum_by_quarter AS (
SELECT pg.uniqueid, price_group, quarters, SUM(unitprice * quantity) AS total_sold
FROM product_grouped pg
INNER JOIN quarters_grouped qg
ON pg.uniqueid = qg.uniqueid
GROUP BY pg.uniqueid, price_group, quarters
),
partition_five AS (
SELECT quarters, price_group, uniqueid, total_sold, ROW_NUMBER() OVER (PARTITION BY quarters, price_group ORDER BY total_sold DESC) AS RowNo
FROM sum_by_quarter
)
SELECT *
FROM partition_five
WHERE RowNo <= 5
ORDER BY quarters, price_group, total_sold desc
我想知道过去 8 个季度中不同价格范围的产品的前 5 个销售产品 ID。其中最畅销的定义为来自购物车 table 的 unitprice * quantity
。价格区间为 Cost <= , 10 < Cost <= 25, 25 < Cost <= 100, Cost < 100
。我的查询给了我想要的东西,但是有没有更简单的方法可以在没有所有 case 语句的情况下做到这一点?
考虑根据日期差异计算季度差异。
'Q' + CONVERT(VARCHAR(5), CEILING(DATEDIFF(day, c.cart_orderdate, getdate()) / 91) + 1)
具体在 quarters_grouped CTE 中:
...
quarters_grouped AS (
SELECT
uniqueid,
unitprice,
quantity,
cart_orderdate,
'Q' + CONVERT(VARCHAR(5), CEILING(DATEDIFF(day, c.cart_orderdate, getdate()) / 91) + 1) AS quarters
FROM omc..cart c
WHERE c.cart_orderdate > '2018-01-01'
),
...
Rextester Demo (日期随机)