Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 与客户和日期对应的结果_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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