Sql server SQL Server从两个范围值生成行
我有一张桌子叫chqbook_tbl:Sql server SQL Server从两个范围值生成行,sql-server,Sql Server,我有一张桌子叫chqbook_tbl: CBID CBBankID CBStartNo CBBookEndNo 1 1 1 5 2 1 21 25 3 2 1 5 我还有一张chq_tbl的桌子,如下所示 C_CBBankID C_No 1 2 1
CBID CBBankID CBStartNo CBBookEndNo
1 1 1 5
2 1 21 25
3 2 1 5
我还有一张chq_tbl的桌子,如下所示
C_CBBankID C_No
1 2
1 22
2 1
2 5
现在我需要选择记录获取数据,如下所示:
C_BankID C_No C_Type
1 1 Dynamic
1 2 Static
1 3 Dynamic
1 4 Dynamic
1 5 Dynamic
1 21 Dynamic
1 22 Static
1 23 Dynamic
1 24 Dynamic
1 25 Dynamic
2 1 Static
2 2 Dynamic
2 3 Dynamic
2 4 Dynamic
2 5 Static
您可以使用数字表(如master..spt_values)获取CBStartNo和CBBookEndNo指定范围内的所有数字,然后左键联接chq_tbl,并使用大小写表达式根据空值设置动态/静态属性 这应该起作用:
select
c1.CBBankID,
m.Number as C_No,
case when c2.C_No is null then 'Dynamic' else 'Static' end as C_Type
from master..spt_values m
join chqbook_tbl c1 on m.number between c1.CBStartNo and c1.CBBookEndNo
left join chq_tbl c2 on m.number = c2.C_No and c1.CBBankID = c2.C_CBBankID
where m.type = 'P'
请注意,我使用的numbers表只保存值0-2047,因此如果需要更高的数字,您应该构造一个合适的表,或者使用递归查询动态生成数字
使用理货表,您可以在CBStartNo和CBBOOK END之间生成C_编号。然后在chq_tbl上执行左连接,以确定行是静态的还是动态的
请您解释一下,这些表是如何连接的,以及使用什么逻辑来获得给定的输出?您的问题不清楚。您正在尝试连接两列,如果是,请连接哪两列。什么决定了C_类型是静态的还是动态的?@Shnugo:在chqbook_tbl上,我为每个CBBankID(例如CBBankID 2)的C_编号设置了一个范围,我在另一张表上有5个从1到5的C_编号chq_tbl我现在有一些记录我需要先从CBBankID中选择C_编号,然后从CBBankID中选择除C_编号外的其他记录并添加CBBankID记录。@JosephGagliardo:动态记录不在chq_tbl中,并且动态是从C_noSorry的范围CBSTARTNO到CBBookEndNo中选择的行。我试图帮助你,但我仍然我不知道你的商业逻辑是什么。谢谢,为我工作。谢谢,也为我工作。
WITH E1(N) AS(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b),
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b),
Tally(N) AS(
SELECT TOP(SELECT MAX(CBBookEndNo) FROM chqbook_tbl)
ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM E4
)
SELECT
C_BankID = cb.CBBankID,
C_No = t.N,
C_Ttype = CASE WHEN ct.C_No IS NULL THEN 'Dynamic' ELSE 'Static' END
FROM chqbook_tbl cb
CROSS APPLY(
SELECT N
FROM Tally
WHERE N BETWEEN cb.CBStartNo AND cb.CBBookEndNo
)t
LEFT JOIN chq_tbl ct
ON ct.CBBankID = cb.CBBankID
AND ct.C_No = t.N