简体   繁体   English

按周分组,获取一周的第一天,按工作日旋转

[英]group by week, get first day of week, pivot by weekday

I need to make a query that will show how much of each item/unit combination each customer ordered each week (group by week) while showing the first day the week, and also showing the quantity ordered each day of that week (pivot by weekday). 我需要进行查询,以显示每个客户每周(按周分组)订购的每个项目/单元组合的数量,同时显示一周的第一天,还显示该周每天的订购量(按工作日的枢轴) )。 So far i have this, but I'm not sure how to group this by week. 到目前为止,我有这个,但是我不确定如何按周分组。

SELECT customer_name, item_code, item_desc,  unit, delivery_date, [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday]
FROM (
    SELECT customer_name, item_code , item_desc , unit, delivery_date, DATENAME(dw, delivery_date) AS DayWeek, qty
    FROM order_items oi inner join orders on localID = local_order_id
    ) AS ordersItems
    pivot (
        SUM(qty) FOR DayWeek IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday])
    ) AS pvt

The following query groups by customer/item/unit/week# combination. 以下查询按客户/项目/单位/周#组合分组。 It returns the total number of orders as well as the # of orders broken down by the day of the week. 它返回订单总数以及按星期几细分的订单数。 The CASE statement is used along with the SUM function to get the total number of orders for each day of the week CASE语句与SUM函数一起使用,以获取一周中每一天的订单总数

EDIT : Revised query to group by Week Starting Date (instead of week # previously) 编辑 :修改查询以按周开始日期分组(而不是以前的第#周)

SELECT customer_name, item_code, item_desc, unit, 
CASE SIGN(7-(DATEPART(dw, action)+2))
  WHEN -1 THEN CAST(DATEADD(dd, 7-(DATEPART(dw, action)+2), action) AS DATE)
  WHEN 0 THEN CAST(action AS DATE)
  WHEN 1 THEN CAST(DATEADD(dd, -(DATEPART(dw, action)+2), action) AS DATE)
END Week_Starting_Friday
SUM(qty) Total_Orders, 
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Monday' THEN qty ELSE 0 END
) [Monday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Tuesday' THEN qty ELSE 0 END
) [Tuesday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Wednesday' THEN qty ELSE 0 END
) [Wednesday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Thursday' THEN qty ELSE 0 END
) [Thursday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Friday' THEN qty ELSE 0 END
) [Friday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Saturday' THEN qty ELSE 0 END
) [Saturday],
SUM(
    CASE DATENAME(dw, delivery_date) WHEN 'Sunday' THEN qty ELSE 0 END
) [Sunday]
FROM order_items oi inner join orders on localID = local_order_id
GROUP BY customer_name, item_code, item_desc, unit, 
CASE SIGN(7-(DATEPART(dw, action)+2))
  WHEN -1 THEN CAST(DATEADD(dd, 7-(DATEPART(dw, action)+2), action) AS DATE)
  WHEN 0 THEN CAST(action AS DATE)
  WHEN 1 THEN CAST(DATEADD(dd, -(DATEPART(dw, action)+2), action) AS DATE)
END
ORDER BY 5, customer_name, item_code, item_desc, unit;

References : 参考文献

  1. CASE statement on MSDN MSDN上的CASE声明
  2. DATENAME on MSDN MSDN上的DATENAME

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM