如何解决在 cte
我有一些订单号,想检查是否有任何编号被跳过。我将使用左表方法,即:
select * from
#CreatedCrossTable (which has all possibilities)
Left Join #MainTableWhichHaveRealSerialNo mt
where
mt is null
订单无结构为:“CodeType.Year.Month.SerialNo”。例如:“DP.21.07.001”、“DP.21.07.002”……或者不是DP,而是“FB.21.07.001”、“FB.21.07.002”等
我想创建一个交叉表模式来确定跳过的 SerilNo 值 (CreatedCrossTable 以上):
(序列号每月重置一次)
CodeType | Year | Month | SerialNo
DP 21 1 1
DP 21 1 2
DP 21 1 3
DP 21 1 4
...
(All SerialNos must increase max serial number of the original table's SerialNo (MainTableWhichHaveRealSerialNo) Also codeType,year and month values must match)
DP 21 2 1
DP 21 2 2
...
FB 21 1 1
FB 21 1 2
...
FB 21 1 1
FB 21 1 2
FB 21 1 3
...
每个代码和月份的序列号都有不同的最大数量 用于创建交叉表。我已经编写了该代码:
;WITH cteSerialNo AS
(
SELECT 1 AS ORDERNO
UNION ALL
SELECT (ORDERNO+1) AS ORDERNO FROM cteSerialNo WHERE ORDERNO < MAX_ORDER_NO
),cteMonthYear AS
(
SELECT CAST('2021.01.01' AS DATE) AS Dt
UNION ALL
SELECT DATEADD(MONTH,1,Dt) AS Dt
FROM cteMonthYear
WHERE DATEADD (MONTH,Dt) < GETDATE()
)
SELECT
*
FROM
(
SELECT
CODES.CODETYPE,YEAR(Dts.Dt) AS 'YEAR',MONTH(Dts.Dt) AS 'MONTH'
FROM
##KK_TBL_CODETYPES AS CODES
CROSS JOIN cteMonthYear AS Dts
) AS CROSSTABLE
CROSS JOIN cteSerialNo AS cSN
如何为这段代码中的每个变量输入 (MAX_ORDER_NO)?
解决方法
假设最大 SerialNo
值基于 SerialNo
列中的现有值,您可能只想找到该 SerialNo
值之前的所有可能组合,然后删除那些在源数据中有匹配项:
-- Define test data
declare @t table(CodeType varchar(2),[Year] int,[Month] int,SerialNo int);
insert into @t values
('DP',21,1,1),('DP',2),3)
--,4) -- Missing so should be in Output,5),2,('FB',2)
--,3) -- Missing so should be in Output,4)
;
with m as -- Get Max SerialNo for each grouping
(
select CodeType,[Year],[Month],max(SerialNo) as MaxSerialNo
from @t
group by CodeType,[Month]
),t as -- Create a table with 10 rows in
(
select t
from(values(1),(1),(1)) as t(t)
),n as -- Self join those 10 rows 5 times to generate a possible 10*10*10*10*10 = 100,000 incrementing numbers using row_number
(
select top(select max(MaxSerialNo) from m) row_number() over (order by (select null)) as n
from t,t t2,t t3,t t4,t t5
)
-- Join from the numbers table to the source data to generate all possible SerialNo values up to the Max
select m.CodeType,m.[Year],m.[Month],n.n as SerialNo
from n
left join m
on n.n <= m.MaxSerialNo
except -- Then exclude any that are in the source data
select CodeType,SerialNo
from @t
order by CodeType,SerialNo
输出
代码类型 | 年 | 月 | 序列号 |
---|---|---|---|
DP | 21 | 1 | 4 |
脸书 | 21 | 2 | 3 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。