在 SQL 服务器中循环游标
Loop through a cursor in SQL Server
我想了解如何在 SQL 查询的 Where 子句中使用游标的内容。
我尝试 运行 下面的代码,但没有结果。
字段 salescostindex 使我能够识别与客户的每笔交易的具体销售额和成本。现在我需要了解何时将成本记入成本中心,以及何时将相应的销售额记入另一个成本中心。这就是为什么我需要循环,我需要从销售账户 100001 中排除一个成本中心,以便在成本账户 200001 中每次选择相同的成本中心。
现在,当我使用一个成本中心时,我知道这是在例程中发生的,这是有效的,但是当我让它在游标上循环时,没有返回任何结果。`
这是数据示例。
在 SalesCostIndex 字段中,您会看到数字 000010、000105、002008 出现在一个成本中心的分类帐 200001 和另一个成本中心的分类帐 100001 中。
所以我想要一个查询,它只获取出现在一个成本中心的分类帐 200001 和另一个成本中心的分类帐 100001 中的 salescostindex。
现在真实数据集中的成本中心超过100个
+------------+------------+----------------+--------+-------------+
| Date | CostCentre | SalesCostIndex | Ledger | SalesAmount |
+------------+------------+----------------+--------+-------------+
| 2018-09-21 | 100 | 000010 | 100001 | -100 |
| 2018-09-01 | 100 | 000105 | 100001 | -154 |
| 2018-08-23 | 100 | 002008 | 200001 | 67 |
| 2018-08-23 | 100 | 001525 | 200001 | 45 |
| 2018-07-21 | 101 | 001731 | 100001 | -101 |
| 2018-08-23 | 101 | 000010 | 200001 | 80 |
| 2018-08-23 | 101 | 001964 | 200001 | 75 |
| 2018-08-23 | 101 | 002001 | 200001 | 112 |
| 2018-08-23 | 102 | 002245 | 200001 | 210 |
| 2018-08-23 | 102 | 000105 | 200001 | 125 |
| 2018-08-23 | 102 | 002008 | 100001 | -91 |
| 2018-08-27 | 102 | 002115 | 200001 | 25 |
+------------+------------+----------------+--------+-------------+
我无法尝试包括插入到临时文件中的方法 table。这是因为我没有对数据库的写入权限,也无法创建对象,因此我只能坚持使用 SELECT
语句或任何不写入数据库的语句的结果。
DECLARE @CC VARCHAR(MAX)
DECLARE CCcursor CURSOR
FOR SELECT DISTINCT CostCentre FROM
LedgerTransactions
WHERE
Ledger='200001' and
Date = '2018-08-23' and
CostCentre like '1__'
OPEN CCcursor
FETCH NEXT FROM CCcursor
INTO @CC
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT CostCentre,
SalesCostIndex,
Sum(SalesAmount) as TotalSales
FROM
LedgerTransactions
WHERE
Ledger='100001' and
CostCentre not in (@CC) and
SalesCostIndex in
(Select Distinct SalesCostIndex
FROM LedgerTransactions
WHERE
Ledger='200001' and
Date = '2018-08-23' AND
CostCentre in (@CC))
GROUP BY
CostCentre, SalesCostIndex
FETCH NEXT FROM CCcursor
INTO @CC
END
CLOSE CCcursor
看看这是否满足您的需求:
Select
SalesCostIndex
From dbo.Cost_Index As ci1
Inner Join dbo.Cost_Index As ci2
On ci2.SalesCostIndex = ci1.SalesCostIndex
Where ci1.Ledger = '100001'
And ci2.Ledger = '200001'
And ci1.CostCentre <> ci2.CostCentre
我想了解如何在 SQL 查询的 Where 子句中使用游标的内容。
我尝试 运行 下面的代码,但没有结果。
字段 salescostindex 使我能够识别与客户的每笔交易的具体销售额和成本。现在我需要了解何时将成本记入成本中心,以及何时将相应的销售额记入另一个成本中心。这就是为什么我需要循环,我需要从销售账户 100001 中排除一个成本中心,以便在成本账户 200001 中每次选择相同的成本中心。 现在,当我使用一个成本中心时,我知道这是在例程中发生的,这是有效的,但是当我让它在游标上循环时,没有返回任何结果。`
这是数据示例。 在 SalesCostIndex 字段中,您会看到数字 000010、000105、002008 出现在一个成本中心的分类帐 200001 和另一个成本中心的分类帐 100001 中。 所以我想要一个查询,它只获取出现在一个成本中心的分类帐 200001 和另一个成本中心的分类帐 100001 中的 salescostindex。 现在真实数据集中的成本中心超过100个
+------------+------------+----------------+--------+-------------+
| Date | CostCentre | SalesCostIndex | Ledger | SalesAmount |
+------------+------------+----------------+--------+-------------+
| 2018-09-21 | 100 | 000010 | 100001 | -100 |
| 2018-09-01 | 100 | 000105 | 100001 | -154 |
| 2018-08-23 | 100 | 002008 | 200001 | 67 |
| 2018-08-23 | 100 | 001525 | 200001 | 45 |
| 2018-07-21 | 101 | 001731 | 100001 | -101 |
| 2018-08-23 | 101 | 000010 | 200001 | 80 |
| 2018-08-23 | 101 | 001964 | 200001 | 75 |
| 2018-08-23 | 101 | 002001 | 200001 | 112 |
| 2018-08-23 | 102 | 002245 | 200001 | 210 |
| 2018-08-23 | 102 | 000105 | 200001 | 125 |
| 2018-08-23 | 102 | 002008 | 100001 | -91 |
| 2018-08-27 | 102 | 002115 | 200001 | 25 |
+------------+------------+----------------+--------+-------------+
我无法尝试包括插入到临时文件中的方法 table。这是因为我没有对数据库的写入权限,也无法创建对象,因此我只能坚持使用 SELECT
语句或任何不写入数据库的语句的结果。
DECLARE @CC VARCHAR(MAX)
DECLARE CCcursor CURSOR
FOR SELECT DISTINCT CostCentre FROM
LedgerTransactions
WHERE
Ledger='200001' and
Date = '2018-08-23' and
CostCentre like '1__'
OPEN CCcursor
FETCH NEXT FROM CCcursor
INTO @CC
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT CostCentre,
SalesCostIndex,
Sum(SalesAmount) as TotalSales
FROM
LedgerTransactions
WHERE
Ledger='100001' and
CostCentre not in (@CC) and
SalesCostIndex in
(Select Distinct SalesCostIndex
FROM LedgerTransactions
WHERE
Ledger='200001' and
Date = '2018-08-23' AND
CostCentre in (@CC))
GROUP BY
CostCentre, SalesCostIndex
FETCH NEXT FROM CCcursor
INTO @CC
END
CLOSE CCcursor
看看这是否满足您的需求:
Select
SalesCostIndex
From dbo.Cost_Index As ci1
Inner Join dbo.Cost_Index As ci2
On ci2.SalesCostIndex = ci1.SalesCostIndex
Where ci1.Ledger = '100001'
And ci2.Ledger = '200001'
And ci1.CostCentre <> ci2.CostCentre