22,210
社区成员
发帖
与我相关
我的任务
分享
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
;WITH CTE AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,T3.branch_name,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM CTE GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
JOIN bi_t_branch_info T3 ON T1.branch_no=T3.branch_no
LEFT JOIN CTE T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
[/quote]
你好,我自己修改好了,谢谢您。DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
;WITH CTE AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,T3.branch_name,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM CTE GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
JOIN bi_t_branch_info T3 ON T1.branch_no=T3.branch_no
LEFT JOIN CTE T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
;WITH CTE AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM CTE GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
LEFT JOIN CTE T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
你试下[/quote]
可否再加一个branch_name字段?DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
;WITH CTE AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM CTE GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
LEFT JOIN CTE T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
你试下[/quote]
执行以上语句就可以了。WITH bi_t_branch_info(branch_no) AS (
SELECT '94'
),
pos_t_daysum_item(branch_no,oper_date) AS (
-- SELECT '94','20150301' UNION ALL
SELECT '94','20150302' UNION ALL
SELECT '94','20150303' UNION ALL
SELECT '94','20150304' UNION ALL
SELECT '94','20150305' UNION ALL
SELECT '94','20150306' UNION ALL
SELECT '94','20150307' UNION ALL
SELECT '94','20150308' UNION ALL
SELECT '94','20150309' UNION ALL
SELECT '94','20150310' UNION ALL
SELECT '94','20150311' UNION ALL
SELECT '94','20150312' UNION ALL
SELECT '94','20150313' UNION ALL
SELECT '94','20150314' UNION ALL
SELECT '94','20150315' UNION ALL
SELECT '94','20150316' UNION ALL
SELECT '94','20150317' UNION ALL
SELECT '94','20150318' UNION ALL
SELECT '94','20150319' UNION ALL
SELECT '94','20150320' UNION ALL
SELECT '94','20150321' UNION ALL
SELECT '94','20150322' UNION ALL
SELECT '94','20150323' UNION ALL
SELECT '94','20150324' UNION ALL
SELECT '94','20150325' UNION ALL
SELECT '94','20150326' UNION ALL
-- SELECT '94','20150327' UNION ALL
SELECT '94','20150328' UNION ALL
SELECT '94','20150329' UNION ALL
SELECT '94','20150330' UNION ALL
SELECT '94','20150331'
),
t1 AS ( -- 应有记录
SELECT b.branch_no,
DATEADD(day,n.number,'2015-03-01') oper_date
FROM bi_t_branch_info b,
(SELECT number
FROM master..spt_values
WHERE type = 'p'
AND number < 31
) n
)
, t2 AS ( -- 已有记录
SELECT left(a.branch_no,2) branch_no,
cast(a.oper_date as datetime) oper_date
FROM pos_t_daysum_item a
WHERE ( a.oper_date >= '20150301')
And ( a.oper_date <= '20150331')
And ( left(a.branch_no,2) in ('94','*'))
GROUP by left(a.branch_no,2), cast(a.oper_date as datetime)
)
-- 缺少
SELECT t1.*
FROM t1
LEFT JOIN t2
ON t1.branch_no = t2.branch_no
AND t1.oper_date = t2.oper_date
WHERE t2.oper_date IS NULL
branch_no oper_date
--------- -----------------------
94 2015-03-01 00:00:00.000
94 2015-03-27 00:00:00.000
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
;WITH CTE AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM CTE GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
LEFT JOIN CTE T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
你试下DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
--开始日期和结束日期可以随意替换
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM bi_t_branch_info T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
LEFT JOIN(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
[/quote]
你好,执行以上语句后,会把所有门店未上传数据的日期情况全部显示出来了,而不是显示编号为94的情况。DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150201'
SET @EndDate='20150304'
--开始日期和结束日期可以随意替换
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM bi_t_branch_info T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEDIFF(DAY,@StartDate,@EndDate)+1
LEFT JOIN(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)T4 ON T1.branch_no=T4.branch_no AND DATEADD(DAY,T2.number,@StartDate)=T4.oper_date
WHERE T4.branch_no IS NULL
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150301'
SET @EndDate='20150331'
--我把开始日期和结束日期提取出来了,你可以随意替换上面的日期范围
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM bi_t_branch_info T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEPART(DAY,@EndDate)
LEFT JOIN(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)T4 ON T1.branch_no=T4.branch_no AND T2.number=DATEPART(DAY,T4.oper_date)-1
WHERE T4.branch_no IS NULL
WITH t1 AS ( -- 应有记录
SELECT b.branch_no,
DATEADD(day,n.number,'2015-03-01') oper_date
FROM bi_t_branch_info b,
(SELECT number
FROM master..spt_values
WHERE type = 'p'
AND number < 31
) n
)
, t2 AS ( -- 已有记录
SELECT left(a.branch_no,2) branch_no,
cast(a.oper_date as datetime) oper_date
FROM pos_t_daysum_item a
WHERE ( a.oper_date >= '20150301')
And ( a.oper_date <= '20150331')
And ( left(a.branch_no,2) in ('94','*'))
GROUP by left(a.branch_no,2), cast(a.oper_date as datetime)
)
-- 缺少
SELECT t1.*
FROM t1
LEFT JOIN t2
ON t1.branch_no = t2.branch_no
AND t1.oper_date = t2.oper_date
WHERE t2.oper_date IS NULL
DECLARE @StartDate DATETIME,@EndDate DATETIME
SET @StartDate='20150301'
SET @EndDate='20150331'
;WITH T1 AS(
SELECT LEFT(branch_no,2)branch_no
,oper_date
FROM pos_t_daysum_item
WHERE oper_date>=@StartDate AND oper_date<=@EndDate
AND LEFT(branch_no,2)IN('94','*')
)
SELECT T1.branch_no,DATEADD(DAY,T2.number,@StartDate)oper_date
FROM(SELECT branch_no FROM T1 GROUP BY branch_no)T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<DATEPART(DAY,@EndDate)
LEFT JOIN(
SELECT T1.branch_no,T1.oper_date FROM T1
JOIN bi_t_branch_info T3 ON T1.branch_no=T3.branch_no
)T4 ON T1.branch_no=T4.branch_no AND T2.number=DATEPART(DAY,T4.oper_date)-1
WHERE T4.branch_no IS NULL