在 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