Sql server 尝试添加select语句中多行的总计
在最后一个SELECT语句的最底部,我想列出总数量。我想把OP.TotalQuantity的结果加起来,即第行的total_number_of_units,并将该数字列在表的底部。但是我很难弄清楚如何合计行数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
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,'<', '<')
select @ret = replace(@ret,'>', '>')
select @ret
说真的,谁直接在存储过程中编写HTML?我没有写那个代码。这是施乐公司的一个应用程序。不过我同意。这有点可笑。但我不够聪明,无法重写他们所有的代码。哇,真的吗?…那太疯狂了。显然,我应该事先说这不是我糟糕的代码。。。被否决直到我得不到答案是不酷的…也许是这样,但不一定,就问题而言,这不是最好的。也许你可以看看