Перебрать два цикла (CURSOR и WHILE) и распечатать записи, сгруппированные по местоположению. - PullRequest
0 голосов
/ 18 июня 2020
• 1000 1004 * Как я могу это исправить?
    DECLARE @DateMovementsTopWorst AS DATE;
    DECLARE @InventoryOnSiteTopWorst AS NUMERIC;
    DECLARE @FamilyTopWorst AS VARCHAR(50)
    DECLARE @BufferTopWorst AS NUMERIC;
    DECLARE @SkuTopWorst AS VARCHAR(50);
    DECLARE @LocationTopWorst AS VARCHAR(50);
    DECLARE @Counter3 AS INT = 1;
    DECLARE @Location AS VARCHAR(50);
    DECLARE @Temporal2 AS INT = 10;
    DECLARE ExternCursor CURSOR
        FOR SELECT DISTINCT(LOCATION) FROM TFSCM_CLI_BUFFER

    OPEN ExternCursor
    FETCH NEXT FROM ExternCursor INTO @Location;
    WHILE @@FETCH_STATUS = 0 
    --WHILE @Counter3 <  @Temporal+1
    BEGIN
        DECLARE @Counter2 AS INT = 1;
        --SET ROWCOUNT @Counter3;
        PRINT ' SKU: '
            + '     Size: '
            + '     Family: '
            + '     Inventory: '
            + '     Movement Date: '

        WHILE @Counter2 < 6
        BEGIN
            SET ROWCOUNT @Counter2;

                SELECT @SkuTopWorst= SKU,
                    @BufferTopWorst= BUFFER,
                    @FamilyTopWorst = FAMILY,
                    @InventoryOnSiteTopWorst = TOTAL_INVENTORY_ON_SITE,
                    @DateMovementsTopWorst = UPDATE_MOVEMENTS,
                    @LocationTopWorst = LOCATION,
                    @Temporal2 = COUNT(*) OVER ()
                FROM TFSCM_CLI_BUFFER
                WHERE LOCATION = @Location
                ORDER BY TOTAL_INVENTORY_ON_SITE ASC;
                PRINT @SkuTopWorst
                    + ' '
                    + CONVERT(VARCHAR(100), @BufferTopWorst)
                    + '     '
                    +  @FamilyTopWorst
                    + '         '
                    + CONVERT(VARCHAR(100), @InventoryOnSiteTopWorst)
                    + '         '
                    +  CONVERT(VARCHAR(100), @DateMovementsTopWorst);
                SET @Counter2 = @Counter2+1;
        END
        PRINT 'This is: ' + @Location;
        --SET @Counter3 = @Counter3+1;
        FETCH NEXT FROM ExternCursor;
    END
    CLOSE ExternCursor
    DEALLOCATE ExternCursor

Results

Отредактировано с учетом предложений пользователей. Но у нас те же результаты

Ответы [ 2 ]

1 голос
/ 19 июня 2020

В WHILE l oop у вас есть SQL с этим утверждением:

WHERE LOCATION IN (SELECT DISTINCT(LOCATION)
                     FROM TFSCM_CLI_BUFFER)

Итак, WHILE l oop получает все местоположение, вам нужно изменить оба:

FETCH NEXT FROM ExternCursor;

в

FETCH NEXT FROM ExternCursor INTO @location;

, а затем оператор WHERE в

WHERE LOCATION = @location

Таким образом, для каждого отдельного местоположения в TFSCM_CLI_BUFFER WHILE l oop позаботится об одном в время.

PS Объявить @location с другой переменной перед курсором.

1 голос
/ 19 июня 2020

Вы ни для чего не используете данные курсора - поэтому внутренний запрос получает все ваши местоположения. Вам нужно получить значение от курсора, а затем использовать его для фильтрации вашего внутреннего запроса. Требуются следующие изменения:

  1. Добавьте DECLARE @Location AS VARCHAR(50); в начале.
  2. Измените свои fetch на FETCH NEXT FROM ExternCursor INTO @Location;
  3. Измените свой внутренний where должно быть WHERE [LOCATION] = @Location
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...