【发布时间】:2022-01-13 20:24:03
【问题描述】:
我有两个表(见最后创建表和数据的 SQL 脚本):
带列的订单表
- 身份证
- 日期
带有列的OrderItems 表
- 订单编号
- ItemTypeID
我需要选择每天至少有一个 ItemTypeID=6000 的商品的订单数和订单中根本没有 ItemTypeID=6000 的订单数。 到目前为止,我得到了这个,但我不知道如何继续:
SELECT
DATEADD(dd, 0, DATEDIFF(dd, 0, OrderDate)) AS OrderDate,
COUNT(DISTINCT(Orders.ID)) AS TotalOrders
FROM
Orders
JOIN
OrderItems
ON
Orders.ID = OrderItems.OrderID
WHERE
OrderItems.ItemTypeID = 6000
GROUP BY
DATEADD(dd, 0, DATEDIFF(dd, 0, OrderDate))
创建测试数据的脚本:
CREATE TABLE OrderItems(
[ID] [int] NOT NULL,
[OrderID] [int] NOT NULL,
[ItemTypeID] [int] NOT NULL
)
CREATE TABLE Orders(
[ID] [int] NOT NULL,
[OrderDate] [date] NOT NULL
)
GO
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (1, 1, 1000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (2, 1, 6000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (3, 2, 1000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (4, 3, 1000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (5, 3, 1000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (6, 4, 1000)
INSERT [OrderItems] ([ID], [OrderID], [ItemTypeID]) VALUES (7, 4, 6000)
INSERT [Orders] ([ID], [OrderDate]) VALUES (1, CAST(N'2021-12-01' AS Date))
INSERT [Orders] ([ID], [OrderDate]) VALUES (2, CAST(N'2021-12-01' AS Date))
INSERT [Orders] ([ID], [OrderDate]) VALUES (3, CAST(N'2021-12-02' AS Date))
INSERT [Orders] ([ID], [OrderDate]) VALUES (4, CAST(N'2021-12-03' AS Date))
GO
预期结果应如下所示:
OrderDate OrdersWithItem OrdersWithoutItem
2021-12-01 1 1
2021-12-02 0 1
2021-12-03 1 0
【问题讨论】:
-
请为所提供的样本数据提供您想要的结果。
-
想想! OrderDate 定义为 DATE。表达式
DATEADD(dd, 0, DATEDIFF(dd, 0, OrderDate))没有任何用处。也不需要它,因为您可以将日期时间值转换为日期来完成相同的事情,而不会产生复杂性和不可读性。你真正节省了多少精力输入“dd”而不是“day”?
标签: sql sql-server tsql