在SQL Server中遍历游标

时间:2018-10-17 15:17:06

标签: sql-server sql-server-2008 variables cursor where-clause

我想了解如何在SQL查询的Where子句中使用游标的内容。

我尝试运行下面的代码,但没有结果。

字段salescostindex允许我识别与客户进行的每笔交易的特定销售和成本。现在,我需要了解何时将成本预定到成本中心并将相应的销售额预定到另一个。这就是为什么需要循环的原因,对于成本帐户200001中每个相同成本中心的选择,我需要从销售帐户100001中排除成本中心。 现在,当我使用成本中心知道例程中正在发生这种情况时,此方法可以正常工作,但是当我让它在游标上循环时,不会返回任何结果。

这里是数据样本。 在SalesCostIndex字段中,您看到一个成本中心的分类帐200001和另一个成本中心的分类帐100001中分别显示了000010、000105、002008。 因此,我希望有一个查询,该查询仅选择出现在一个成本中心的分类帐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 |
+------------+------------+----------------+--------+-------------+

我无法尝试包括将其插入到临时表中的方法。这是因为我没有对数据库的写访问权限,也无法创建对象,因此,我必须只坚持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

1 个答案:

答案 0 :(得分:0)

看看这是否满足您的需求:

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