Зацикливание курсора в SQL Server - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы понять, как я могу использовать содержимое курсора в предложении Where SQL-запроса.

Я попытался выполнить приведенный ниже код, но не получил результата.

Поле salescostindex позволяет мне определять конкретные продажи и затраты для каждой транзакции с клиентом.Теперь мне нужно понять, когда затраты регистрируются в МВЗ, а соответствующие продажи регистрируются в другом.Вот почему мне нужен цикл, мне нужно исключить МВЗ из счета продаж 100001 для каждого выбора одного и того же МВЗ в счете затрат 200001. Теперь, когда я использую МВЗ, где я знаю, что это происходит в процедуре, это работает, тем не менее, когда я позволяю циклу пересечь курсор, результат не возвращается.

Вот пример данных.в поле SalesCostIndex вы видите, что числа 000010, 000105, 002008 появляются в регистре 200001 в одном МВЗ и в регистре 100001 в другом МВЗ.Поэтому я хотел бы получить запрос, который собирает только индекс продаж, который отображается в бухгалтерской книге 200001 в одном МВЗ и в журнале 100001 в другом МВЗ.Теперь центры затрат в реальном наборе данных превышают 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 голосов
/ 18 октября 2018

Проверьте, соответствует ли это вашим потребностям:

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
...