【问题标题】:SQL query for finding UNITS in EACH category ordered on each day of the week for the itemsSQL 查询,用于查找在一周中的每一天为项目订购的每个类别中的 UNITS
【发布时间】:2020-09-11 15:17:45
【问题描述】:

以下是我需要的详细信息:

  1. 查找过去 7 天内在一周中的每一天订购的每个类别中的单元。 -- 输出为:
Category | Sunday_units | Monday_units | Tuesday_units | Wednesday_units | Thursday_units | Friday_units | Saturday_units
  1. 在每个客户下至少两个订单的每个日期查找第二个最早的 ORDER_ID

    我还想为这些表开发带有映射的 ER 模型。对于开发具有基数的 ER 模型,我认为:1 个项目 --> 可以有 1 个或多个订单 1 个订单 ---> 只能有一个项目(根据架构) 请验证模型基数是否正常。

我尝试使用 case 语句查找 SQL 服务器查询。

架构:

订单

order_id varchar(20) composite primary key
customer_id numeric(35,0)
order_datetime timestamp
item_id varchar(10) composite primary key
order_quantity numeric(35,0)

ORDERS 的示例摘录

order_id | customer_id | order_datetime | item_id | order_quantity
A-001    | 32483       | 2018-12-15 09:15:22 | B000 | 3                 
A-005    | 21456       | 2019-01-12 09:28:35 | B001 | 1
A-005    | 21456       | 2019-01-12 09:28:35 | B005 | 1
A-006    | 42491       | 2019-01-16 02:52:07 | B008 | 2

物品

item_id varchar(10) primary key
item_category varchar(18)

ITEMS 的样本摘录

item_id | item_category
B000 | Outdoors
B001 | Outdoors
B002 | Outdoors
B003 | Kitchen
B004 | Kitchen

我创建的查询如下:

查看查询,我们怎么知道01-10-2019 是星期四?我还想知道日期和相应的星期计算。

Select i.item_category, 
    Sum(case when o.order_datetime = '01-10-2019' THEN o.Count(order_quantity) else null end) as Thursday_Units,
    Sum(case when o.order_datetime = '01-11-2019' THEN o.Count(order_quantity) else null end) as Friday_Units,
    Sum(case when o.order_datetime = '01-12-2019' THEN o.Count(order_quantity) else null end) as Saturday_Units,
    Sum(case when o.order_datetime = '01-13-2019' THEN o.Count(order_quantity) else null end) as Sunday_Units,
    Sum(case when o.order_datetime = '01-14-2019' THEN o.Count(order_quantity) else null end) as Monday_Units,
    Sum(case when o.order_datetime = '01-15-2019' THEN o.Count(order_quantity) else null end) as Tuesday_Units,
    Sum(case when o.order_datetime = '01-16-2019' THEN o.Count(order_quantity) else null end) as Wednesday_Units
from Orders o
inner join Items i on o.item_id = i.item_id
group by i.item_category

【问题讨论】:

  • 您可以使用 DATENAME(W,getdate()) 来确定星期几。此外,您可以在解决方案中使用 PIVOT 而不是 CASE。
  • 您的架构需要认真审查。 OrderDateTime 不应该是时间戳。该数据类型与时间或日期无关。其他列也有问题。不要只是盲目地选择数据类型。而且您会发现一个订单通常包含多个项目 - 您很可能缺少一张桌子(或更多)。
  • @C.G 你知道accepting/up-voting answers 对吗?只是您似乎没有接受任何问题的答案。
  • order_datetime in Orders 是一个timestamp。它与DateTime 无关。如果确实如此,那么除非您碰巧收到很多夜间订单,否则将其与给定日期的午夜进行比较不太可能匹配。

标签: sql sql-server tsql group-by pivot


【解决方案1】:

你可以使用datename():

select 
    i.item_category, 
    sum(case when datename(weekday, o.order_datetime) = 'Sunday' then order_quantity end) as sunday_units,
    sum(case when datename(weekday, o.order_datetime) = 'Monday' then order_quantity end) as monday_units,
    ...
    sum(case when datename(weekday, o.order_datetime) = 'Saturday' then order_quantity end) as saturday_units,
from orders o 
inner join items i  on o.item_id = i.item_id
where o.order_datetime >= dateadd(day, -7, cast(getdate() as date))
group by i.item_category

我还添加了一个 where 子句,用于过滤过去 7 天。请注意,使用此技术时,列不代表连续日期(如果今天是星期一,则上周五的数据比上周二的数据更新)。

【讨论】:

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