簡體   English   中英

在SQL Server中游標循環

[英]Loop through a cursor in SQL Server

我想了解如何在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

查看是否滿足您的需求:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM