You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中对比匹配表行时如何正确显示负数值

SQL Server多行合并带符号同步解决方案

核心修改逻辑

原有逻辑已经完成了按首行分组拆分子行数量的功能,仅需新增分组首行负号同步的逻辑即可:读取每个分组首行(InvoiceDate非空行)的Quantity字段符号,将该符号应用到当前分组下所有关联的子行数量上。

完整可运行代码

DECLARE @tmpTable TABLE
(
    RowID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    InvoiceDate NVARCHAR(20),
    Description NVARCHAR(MAX),
    Quantity NVARCHAR(20)
)
INSERT INTO @tmpTable
SELECT * FROM (VALUES
('07/18/2021','MedName','-18'),
(NULL,'18 Patient1',''),
('07/18/2021','MedName','-5'),
(NULL,'2 Patient2',''),
(NULL,'3 Patient3',''),
('07/18/2021','MedName','7'),
(NULL,'1 Patient2',''),
(NULL,'6 Patient3','')
) AS temp
(InvoiceDate,
    Description,
    Quantity)

SELECT * FROM @tmpTable

DECLARE @tblTmp TABLE
    (
        RowID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
        InvoiceDate NVARCHAR(20),
        Description NVARCHAR(MAX),
        Quantity NVARCHAR(20)
    )
    DECLARE @tblTmp1 TABLE
    (
        [RowID] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
        [InvoiceDate] DATETIME,
        [MedDescription] [NVARCHAR](MAX),
        [Quantity] [DECIMAL](18,2)
    )
    BEGIN TRY
    INSERT INTO @tblTmp
    SELECT InvoiceDate,   Description, Quantity FROM @tmpTable
    ; WITH
        CTE (InvoiceDate , Description,  Quantity) AS (
    SELECT t1.InvoiceDate,  t1.Description, 
    -- 核心修改:同步首行的正负符号
    CASE 
        WHEN LEFT(t1.Quantity, 1) = '-' 
        THEN -1 * CAST(t2.Quantity AS DECIMAL(18,2)) 
        ELSE CAST(t2.Quantity AS DECIMAL(18,2)) 
    END Quantity
    FROM (
       SELECT *
       , ISNULL((SELECT MIN(RowID) FROM @tblTmp st WHERE InvoiceDate is NOT NULL and st.RowId > t.RowId) -1, (SELECT MAX(RowID) FROM @tblTmp)) NewVal
       FROM @tblTmp t
       WHERE InvoiceDate is NOT NULL
       ) t1
       JOIN (
       SELECT RowID, LTRIM(RIGHT(Description, LEN(Description) - PATINDEX('%[0-9][^0-9]%', Description ))) CustomerPo,
       CASE WHEN ISNUMERIC(LEFT(Description, CHARINDEX(' ', Description) -1)) = 1 THEN
      LEFT( Description, CHARINDEX (' ', Description) -1) ELSE 0 END Quantity
       FROM @tblTmp
       WHERE InvoiceDate is NULL
       ) t2 ON t2.RowId BETWEEN t1.RowID and t1.NewVal
       )

    INSERT INTO @tblTmp1 (InvoiceDate , MedDescription,  Quantity)
    SELECT CONVERT(DATETIME,InvoiceDate, 101)  , Description,
    Quantity
    FROM CTE;

    SELECT * FROM @tblTmp1
    
 END TRY
 BEGIN CATCH
 SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_STATE() AS ErrorState,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

输出说明

运行后@tblTmp1的Quantity字段会自动继承对应分组首行的符号:

  • 前两个分组首行Quantity带负号,对应子行数量分别为-18、-2、-3
  • 第三个分组首行Quantity为正数,对应子行数量保持1、6不变

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:06:07