繁体   English   中英

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

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

我需要进行查询,以显示每个客户每周(按周分组)订购的每个项目/单元组合的数量,同时显示一周的第一天,还显示该周每天的订购量(按工作日的枢轴) )。 到目前为止,我有这个,但是我不确定如何按周分组。

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

以下查询按客户/项目/单位/周#组合分组。 它返回订单总数以及按星期几细分的订单数。 CASE语句与SUM函数一起使用,以获取一周中每一天的订单总数

编辑 :修改查询以按周开始日期分组(而不是以前的第#周)

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;

参考文献

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

暂无
暂无

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

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