Sql 与客户和日期对应的结果
即使两个日期之间没有订单,我如何获得所有日期的订单 样本表Sql 与客户和日期对应的结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,即使两个日期之间没有订单,我如何获得所有日期的订单 样本表 OrderID | Date | CusID 33942 | 6-21-2014 | 6005 34059 | 6-20-2014 | 4003 53333 | 6-23-2014 | 6005 59234 | 6-23-2014 | 4003 我怎么会有这个结果 CusID | Date | OrderID | 4003 | 6-20-2014 | 34059 | 400
OrderID | Date | CusID
33942 | 6-21-2014 | 6005
34059 | 6-20-2014 | 4003
53333 | 6-23-2014 | 6005
59234 | 6-23-2014 | 4003
我怎么会有这个结果
CusID | Date | OrderID |
4003 | 6-20-2014 | 34059 |
4003 | 6-21-2014 | null |
4003 | 6-22-2014 | null |
4003 | 6-23-2014 | 59234 |
6005 | 6-20-2014 | null |
6005 | 6-21-2014 | 33942 |
6005 | 6-22-2014 | null |
6005 | 6-23-2014 | 53333 |
这就是我到目前为止所做的
我创建了一个日历表
CREATE TABLE #Calendar
(
[CalendarDate] DATETIME
)
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @EndDate = GETDATE()
SET @StartDate = DATEADD(Year, -1, @EndDate)
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO #Calendar
(
CalendarDate
)
SELECT
@StartDate
SET @StartDate = DATEADD(dd, 1, @StartDate)
END
创建日期和客户的笛卡尔乘积,然后加入
with cte as
(
select caldate, custid
from calendar, customers
)
select *
from cte
left join temp o
on cte.custid = o.custid
and cast(caldate as date) = cast(orderdate as date)
where caldate between '20140620' and '20140623'
首先,你的日历表坏了。您正在使用日期时间戳,并捕获表中的当前时间戳。写正确的数据比以后处理好 为此,有两种修复方法,使用
DATE
格式或convert
日期删除时间戳。我选择了后者
从这里,您可以缩小到被查询的天数,以及这些天的客户数,并生成这两个子集的交叉连接
DECLARE @ORDER TABLE (ORDERID INT, ordDATE DATETIME, CUSID INT)
INSERT INTO @ORDER (ORDERID, ordDATE, CUSID)
VALUES (33942,'6-21-2014', 6005),
(34059,'6-20-2014',4003),
(53333,'6-23-2014',6005),
(59234,'6-23-2014',4003)
declare @Calendar table ([CalendarDate] DATETIME)
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @EndDate = GETDATE()
SET @StartDate = DATEADD(Year, -1, @EndDate)
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO @Calendar
(
CalendarDate
)
SELECT
CONVERT(DATETIME,FLOOR(CONVERT(FLOAT, @StartDate)))
SET @StartDate = DATEADD(dd, 1, @StartDate)
END
; with dates as
(
SELECT DISTINCT CalendarDate
FROM @Calendar
WHERE CalendarDate BETWEEN '2014-06-20' AND '2014-06-23'
),
orders as
(
SELECT DISTINCT CUSID
FROM @ORDER
WHERE ordDATE BETWEEN '2014-06-20' AND '2014-06-23'
),
cp AS
(
SELECT *
FROM dates
CROSS JOIN orders
)
SELECT cp.CUSID, cp.CalendarDate, O.ORDERID
FROM CP
LEFT OUTER JOIN @ORDER O
ON cp.CalendarDate = O.ordDATE
AND cp.CUSID = O.CUSID
DECLARE@ORDER表(ORDERID INT,ordDATE DATETIME,CUSID INT)
插入@ORDER(ORDERID、ordDATE、CUSID)
价值(33942,'6-21-2014',6005),
(34059,'6-20-2014',4003),
(53333,'6-23-2014',6005),
(59234,'6-23-2014',4003)
声明@Calendar表([CalendarDate]DATETIME)
声明@StartDate DATETIME
声明@EndDate-DATETIME
SET@EndDate=GETDATE()
设置@StartDate=DATEADD(年份,-1,@EndDate)
而@StartDate
DECLARE @ORDER TABLE (ORDERID INT, ordDATE DATETIME, CUSID INT)
INSERT INTO @ORDER (ORDERID, ordDATE, CUSID)
VALUES (33942,'6-21-2014', 6005),
(34059,'6-20-2014',4003),
(53333,'6-23-2014',6005),
(59234,'6-23-2014',4003)
declare @Calendar table ([CalendarDate] DATETIME)
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @EndDate = GETDATE()
SET @StartDate = DATEADD(Year, -1, @EndDate)
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO @Calendar
(
CalendarDate
)
SELECT
CONVERT(DATETIME,FLOOR(CONVERT(FLOAT, @StartDate)))
SET @StartDate = DATEADD(dd, 1, @StartDate)
END
; with dates as
(
SELECT DISTINCT CalendarDate
FROM @Calendar
WHERE CalendarDate BETWEEN '2014-06-20' AND '2014-06-23'
),
orders as
(
SELECT DISTINCT CUSID
FROM @ORDER
WHERE ordDATE BETWEEN '2014-06-20' AND '2014-06-23'
),
cp AS
(
SELECT *
FROM dates
CROSS JOIN orders
)
SELECT cp.CUSID, cp.CalendarDate, O.ORDERID
FROM CP
LEFT OUTER JOIN @ORDER O
ON cp.CalendarDate = O.ordDATE
AND cp.CUSID = O.CUSID