插入临时 table while 语句 SQL

Insert into temporary table while statement SQL

DECLARE @i int = 0
WHILE @i <= 11
BEGIN
DECLARE @YEAR nvarchar(4) = 2021
DECLARE @date DATETIME = dateadd(month, @i, @YEAR );
WITH BSQuery 
AS 
( SELECT  aCCOUNT, [GroupMask], T2.FormatCode, T2.[AcctName], (select month(@date))[month],
( CASE WHEN T2.GroupMask in (2, 3) 
Then -(Sum(T1.[Debit]-T1.[Credit])) ELSE Sum(T1.[Debit]-T1.[Credit]) END) [Balance] FROM OJDT T0 INNER JOIN JDT1 T1 
ON T0.[TransId] = T1.[TransId] INNER JOIN OACT T2 ON T1.[Account] = T2.[AcctCode] WHERE T2.[GroupMask] in (1,2,3) 
and (T0.[RefDate]) <= EOMONTH(@date) GROUP by  T2.FormatCode,T2.[AcctName] ,
[GroupMask],aCCOUNT) Select * from BSQuery Order By 1,2
SET @i = @i + 1
END

以上是我的 SQL 查询,我需要插入临时文件 table。我该如何修改它?

您需要创建一个临时文件 table,然后在 select 语句之前使用插入 table。

create table #temp(
aCCOUNT varchar(255),
groupmask varchar(255),
formatcode varchar(255),
acctname varchar(255),
month int,
Balance bigint
)
DECLARE @i int = 0
WHILE @i <= 11
BEGIN
DECLARE @YEAR nvarchar(4) = 2021
DECLARE @date DATETIME = dateadd(month, @i, @YEAR );
WITH BSQuery 
AS 
( SELECT  aCCOUNT
, [GroupMask]
, T2.FormatCode
, T2.[AcctName]
,(select month(@date))[month]
,( CASE WHEN T2.GroupMask in (2, 3)  Then -(Sum(T1.[Debit]-T1.[Credit])) ELSE Sum(T1.[Debit]-T1.[Credit]) END) [Balance] 
FROM OJDT T0 
INNER JOIN JDT1 T1 
ON T0.[TransId] = T1.[TransId] 
INNER JOIN OACT T2 
ON T1.[Account] = T2.[AcctCode] 
WHERE T2.[GroupMask] in (1,2,3) 
and (T0.[RefDate]) <= EOMONTH(@date) 
GROUP by  T2.FormatCode,T2.[AcctName] ,[GroupMask],aCCOUNT
) insert into #temp (account,groupmask,formatcode,acctname,month,balance)
Select account,groupmask,formatcode,acctname,month,balance from BSQuery Order By 1,2
SET @i = @i + 1
END

我不喜欢混合命令式和声明式语言。

预先声明十二个月的数字并使用 CROSS JOIN 怎么样?

DECLARE @YEAR nvarchar(4) = 2021;

WITH Months(monthNumber) AS (SELECT 1 UNION ALL SELECT monthNumber + 1 FROM T WHERE monthNumber < 12)
SELECT
  aCCOUNT,
  [GroupMask],
  T2.FormatCode,
  T2.[AcctName],
  monthNumber [month],
  IIF(T2.GroupMask IN (2, 3), -1, 1) * SUM(T1.[Debit] - T1.[Credit]) [Balance]
FROM Months
CROSS JOIN OJDT T0
INNER JOIN JDT1 T1 ON T0.[TransId] = T1.[TransId]
INNER JOIN OACT T2 ON T1.[Account] = T2.[AcctCode]
WHERE T2.[GroupMask] IN (1,2,3) 
  AND T0.[RefDate] <= EOMONTH(@YEAR, monthNumber - 1)
GROUP by monthNumber, T2.FormatCode, T2.[AcctName], [GroupMask], aCCOUNT
ORDER BY 1, 2;

请注意,没有样品很难工作 schema/data。