2017-07-12 138 views
-1

嗨我想获得作为一个记录每个不同AgreeId的金额的总和,并且它应该包含该结果的所有其他列作为一个记录好。这是我的SP。请帮助我。选择具有相同Id的列作为一个记录以及其他列

ALTER PROCEDURE sp_Contracts 
@ClientId INT 
,@LocationId INT = NULL 
,@UserId INT = NULL 
AS 
BEGIN 
SET NOCOUNT ON; 

IF (@LocationId = 0) 
BEGIN 
    SET @LocationId = NULL 
END 

SELECT 

    a.AgreementNumber 
    ,a.RONo 
    ,a.PONo 
    ,round([dbo].func_GetAgreementTotalNew (a.AgreementId),2) as 'Total' 
    ,round(a.Discount,2) as 'AdjustmentPostTax' 
    ,round(p.Amount,2) as 'AmountPaid' 
    ,p.PaymentMethod 

FROM tblPay AS p 

INNER JOIN tblAgree AS a ON p.AgreeId = a.AgreeId 
WHERE 
    a.ClientId = @ClientId 
    AND a.[Status] <> 6 
    AND (
     (
      @LocationId IS NULL 
      AND (
       A.CheckoutLocation IN (
        SELECT LocationId 
        FROM [dbo].[tblUserLocations] 
        WHERE UserID = @userId 
         AND IsDeleted = 0 
        ) 
       OR A.CheckoutLocation IS NULL 
       ) 
      ) 
     OR A.CheckoutLocation = @LocationId 
     ) 
    END 
+0

您使用的是MySQL还是MS SQL Server?不要标记不涉及的产品。 – jarlh

+0

此外,表设计将帮助在到达查询 – ArunGeorge

+0

首先修复您的标记,这看起来像SQL服务器,所以删除mysql标记。其次,[不要用'sp_'](https://msdn.microsoft.com/en-us/library/dd172115(v = vs.100).aspx)前缀存储的特效。第三,提供一些样本数据和期望的输出。 – Tanner

回答

0

如果您使用MSSQL,则可以使用窗口分析函数计算聚合值,而不使用GROUP BY子句。

SELECT 
    a.AgreementNumber 
    ,a.RONo 
    ,a.PONo 
    ,round([dbo].func_GetAgreementTotalNew (a.AgreementId),2) as 'Total' 
    ,round(a.Discount,2) as 'AdjustmentPostTax' 
    ,round(p.Amount,2) as 'AmountPaid' 
    ,p.PaymentMethod 
    , SUM(p.Amount) OVER (PARTITION BY p.AgreeId) AS TOT_FOR_ID 
FROM tblPay AS p 
INNER JOIN tblAgree AS a ON p.AgreeId = a.AgreeId 
WHERE a.ClientId = @ClientId 
     AND a.[Status] <> 6 
... 
相关问题