Sql server 尝试添加select语句中多行的总计

Sql server 尝试添加select语句中多行的总计,sql-server,Sql Server,在最后一个SELECT语句的最底部,我想列出总数量。我想把OP.TotalQuantity的结果加起来,即第行的total_number_of_units,并将该数字列在表的底部。但是我很难弄清楚如何合计行数 USE [uStore] GO /****** Object: StoredProcedure [dbo].[Receipt_GetOrderItemsTable_PLB] Script Date: 3/3/2016 4:39:56 PM ******/ S

在最后一个SELECT语句的最底部,我想列出总数量。我想把OP.TotalQuantity的结果加起来,即第行的total_number_of_units,并将该数字列在表的底部。但是我很难弄清楚如何合计行数

USE [uStore]
    GO
    /****** Object:  StoredProcedure [dbo].[Receipt_GetOrderItemsTable_PLB]    Script Date: 3/3/2016 4:39:56 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      <Blake Norwood,,Name>
    -- Create date: <03-03-16,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[Receipt_GetOrderItemsTable_PLB]
        @OrderID int,
        @CultureID int
    AS
    DECLARE @Rows nvarchar(max)
    SET @Rows = ''

SELECT @Rows = 
    @Rows + '<tr><td>' + 
    CASE
        WHEN P.ProductDisplayID IS NULL
        THEN PC.Name  
        ELSE replace(replace(PD.Format, '{0}', PC.Name), '{1}', IsNull(P.CatalogNo, ''))
    END + 
    CASE 
        WHEN OP.CustomerNickName IS NOT NULL
        THEN ' - ' + OP.CustomerNickName 
        ELSE ''
    END +
    '</td><td>' + cast(OP.NumRecipients AS nvarchar) + '</td><td>' + 
    ISNULL(cast(OP.QuantityPerRecipient AS nvarchar) + ' ' + dbo.fn_GetProductUnitName(OP.QuantityPerRecipient, OP.ProductUnitID, @CultureID), '-') + 
    '</td><td>' + cast(OP.TotalQuantity AS nvarchar) + ' ' + dbo.fn_GetProductUnitName(OP.TotalQuantity, OP.ProductUnitID, @CultureID) + '</td><td>' + 
    Case When DM.Name != 'Void' Then dbo.fn_GetLocalizedText(DM.StringID, @CultureID) Else dbo.fn_GetLocalizedText('Receipt_NoDelivery', @CultureID) End + '</td><td>' + IsNull(dbo.fn_GetFormattedPriceForOrderProduct(OP.ProductPriceSubtotal, OP.OrderProductID, @CultureID), '-') + '</td></tr>'
From OrderProduct OP 
JOIN Product P ON P.ProductID = OP.ProductID
Join Product_Culture PC ON P.ProductID  = PC.ProductID AND PC.CultureID = @CultureID
Join DeliveryMethod DM ON OP.DeliveryMethodId = DM.DeliveryMethodId 
LEFT OUTER JOIN ProductDisplay PD ON PD.ProductDisplayID = P.ProductDisplayID
WHERE 
    OP.OrderID = @OrderID AND
    OP.IsDraft = 0 AND
    OP.StatusID <> 2


SELECT
    '<table cellspacing="0" cellpadding="2" width="100%" border="1">' + 
    '<tr><td>' + dbo.fn_GetLocalizedText('product', @CultureID) + '</td><td>' + dbo.fn_GetLocalizedText('number_of_Recipients', @CultureID) + '</td><td>' + dbo.fn_GetLocalizedText('Quantity_Per_Recipient', @CultureID) + '</td><td>' + dbo.fn_GetLocalizedText('total_number_of_units', @CultureID) + '</td><td>' + dbo.fn_GetLocalizedText('delivery_service', @CultureID) + '</td><td>' + dbo.fn_GetLocalizedText('Subtotal', @CultureID) + '</td></tr>' + 
    @Rows + 
    '<tr><td>' + '<b>TOTAL</b>' + '</td><td>' + '</td><td>' + '</td><td>' + sum(TotalQuantity) + ' Items' + '</td><td>' + '</td><td>' + '</td></tr>' + 
    '</table>' AS [TABLE]

如果proc必须返回HTML,那么可以使用一个临时表来存储所有行,其中包含一列用于小计,然后使用Sum和for XML对小计进行合计。这是一个基本的片段,你应该明白我的意思,你必须修改它

create table #tmpRows
( tr varchar(100),
subTotal int
)
--test data, here you'd need to adapt your "select @rows =" statement
insert into #tmpRows
(tr, subTotal)
values ('<tr><td>test row 1</td></tr>', 45)
insert into #tmpRows
(tr, subTotal)
values ('<tr><td>test row 2</td></tr>', 55)
insert into #tmpRows
(tr, subTotal)
values ('<tr><td>test row 3</td></tr>', 65)
go
declare @rows varchar(2000)
declare @total varchar(200)
declare @ret varchar(2200)
select @rows =
         substring(
                (
                    Select ',' + tr + '<td></td>' AS [text()]
                    from #tmpRows
                    For XML PATH ('')
                ), 2, 1000) , @total= '<tr><td></td><td>' +  convert(varchar(10),sum(subtotal)) + '</td></tr>'
                from #tmpRows
select @ret =  replace( @rows + @total,'&lt;', '<')
select @ret = replace(@ret,'&gt;', '>')
select @ret

说真的,谁直接在存储过程中编写HTML?我没有写那个代码。这是施乐公司的一个应用程序。不过我同意。这有点可笑。但我不够聪明,无法重写他们所有的代码。哇,真的吗?…那太疯狂了。显然,我应该事先说这不是我糟糕的代码。。。被否决直到我得不到答案是不酷的…也许是这样,但不一定,就问题而言,这不是最好的。也许你可以看看