如何在第一行的CODE1,CODE2,CODE3列中获取每隔三个的CODE()列值

时间:2019-01-06 15:56:54

标签: sql sql-server

我想获取第一行的COLUMNS(CODE1,CODE2,CODE3)的CODE(column)中提到的三行的值,类似地,第二行的列(CODE1,CODE2,CODE3的CODE(column)中的下三行的值)

我将通过遍历临时表使用循环,但不会给我我想要的结果。请参见下面的附加代码

ALTER PROCEDURE [dbo].[USP_GENERATE_BARCODE]
    (--@SupplierCode int = NULL,
     @campId INT,
     @qty INT)
AS
BEGIN
    BEGIN TRY  
        IF EXISTS (SELECT CAMPID FROM BarCode 
                   WHERE (BarCode.CAMPID = @campId)) 
        BEGIN
            DECLARE @TotalRecord INT;
            DECLARE @cnt INT = 0; 
            DECLARE @flagCounter INT = 1; 
            DECLARE @barCode VARCHAR(50);
            DECLARE @tempId INT;
            DECLARE @barCodeRecordId INT;
            DECLARE @MyVariable INT;

            SET @MyVariable = 1;

            --Temp Table
            DECLARE @TempTable TABLE
                               (
                                   ID INT NOT NULL,
                                   CODE VARCHAR(MAX) NULL   
                               ); 
            SET @TotalRecord = (SELECT COUNT(*) 
                                FROM BarCode 
                                WHERE (CAMPID = @campId AND QTY = @qty))

            WHILE @cnt < @TotalRecord
            BEGIN
                SELECT TOP 1 
                    @barCode = CODE, @barCodeRecordId = ID 
                FROM #TempTable     

                -- select  @flagCounter as flg
                IF (@flagCounter = 1)
                BEGIN
                    SET @tempId = @barCodeRecordId;

                    UPDATE BarCode 
                    SET CODE1 = @barCode 
                    WHERE ID = @tempId  
                END

                IF (@flagCounter = 2)
                BEGIN
                    UPDATE BarCode 
                    SET CODE2 = @barCode 
                    WHERE ID = @tempId
                END

                IF (@flagCounter = 3)
                BEGIN
                    UPDATE BarCode 
                    SET CODE3 = @barCode 
                    WHERE ID = @tempId
                END

                IF (@flagCounter = 4)
                BEGIN
                    UPDATE BarCode 
                    SET CODE4 = @barCode 
                    WHERE ID = @tempId
                END

                IF (@MyVariable = 4)
                BEGIN
                    SET @MyVariable = 0 ;
                END

                --select @cnt as cnts,@MyVariable as myveriable,@flagCounter as flag
                SET @flagCounter = @flagCounter + 1;
                SET @MyVariable = @MyVariable + 1;  
                SET @cnt = @cnt + 1;

                --select @cnt as cntc   
                DELETE #TempTable WHERE ID = @barCodeRecordId   
            END

            SELECT ID, CODE, CODE1, CODE2, CODE3 
            FROM BarCode
        END
        ELSE
            DECLARE @errorMessga VARCHAR(50) = 'does not exist'
        --select @errorMessga
    END TRY
    BEGIN CATCH

    END CATCH
END

procedure result

1 个答案:

答案 0 :(得分:1)

我猜您想要某种枢轴或条件聚合:

select campid,
       max(case when seqnum % 3 = 1 then code end) as code_1,
       max(case when seqnum % 3 = 2 then code end) as code_2,
       max(case when seqnum % 3 = 0 then code end) as code_3
from (select b.*,
             row_number() over (partition by campid order by qty desc) as seqnum
      from barcode bc
     ) b
group by campid, (seqnum - 1) / 3