我想获取第一行的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
答案 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