【问题标题】:How to find sum value of single column from multiple selected columns of stored procedure in sql如何从sql中存储过程的多个选定列中查找单个列的总和值
【发布时间】:2015-10-07 06:42:15
【问题描述】:

在我的 sql 存储过程中,我选择了更多列,我想找到列 NetAmount 的值的总和。只需要找到该列的总和。 以及其他选定的列值。这个怎么选?

为此,我将这样的代码[计算总和(gensal.NetAmount)],这是有效的,但无法通过实体框架为我的 Windows 应用程序选择此值。

这是一个带有可选参数的搜索查询 @EmpId、@MonthId、@YearId

我的代码是:-

ALTER PROCEDURE [dbo].[SP_SearchSalaryReport]

    @EmpId int=null,
    @MonthId int=null,
    @YearId int=null
AS
BEGIN

    SET NOCOUNT ON;


    SELECT ed.Name,
            desig.Designation,
            mon.Month,
            gensal.Year,
            gensal.BasicPay,
            gensal.CasualWorkedDays,
            gensal.CasualWorkedAmount,
            gensal.ApsentDays,
            gensal.ApsentDaysAmount,
            gensal.NetAmount

            --SUM(gensal.NetAmount)[sum] 

            from dbo.Tbl_GenerateSalary gensal join
            dbo.Tbl_Designation desig on gensal.DesignationId=desig.RecordId join 
            dbo.Tbl_EmployeeDetails ed on gensal.EmpId=ed.RecordId join
            dbo.Tbl_Month mon on gensal.Month=mon.RecordId
            where(isnull(@EmpId,0)=0 or gensal.recordId=@EmpId)
            and(ISNULL(@MonthId,0)=0 or gensal.Month = @MonthId)
            and(ISNULL(@YearId,0)=0) or gensal.Year = @YearId
            compute sum(gensal.NetAmount)



END

【问题讨论】:

    标签: winforms entity-framework sql-server-2008 stored-procedures


    【解决方案1】:

    在这种情况下,很明显只使用 SP 来获取数据的非常常见的方法不是一个好主意……继续使用 SP 的返回集是非常痛苦的。

    顺便说一句:不要使用“SP_”前缀...

    尝试使用内联函数(或者使用 VIEW):

    CREATE FUNCTION [dbo].[GetSalaryReport]
    (
        @EmpId int=null,
        @MonthId int=null,
        @YearId int=null
    )
    RETURNS TABLE
    AS
    RETURN
        SELECT  ed.Name,
                desig.Designation,
                mon.Month,
                gensal.Year,
                gensal.BasicPay,
                gensal.CasualWorkedDays,
                gensal.CasualWorkedAmount,
                gensal.ApsentDays,
                gensal.ApsentDaysAmount,
                gensal.NetAmount
    
                from dbo.Tbl_GenerateSalary gensal join
                dbo.Tbl_Designation desig on gensal.DesignationId=desig.RecordId join 
                dbo.Tbl_EmployeeDetails ed on gensal.EmpId=ed.RecordId join
                dbo.Tbl_Month mon on gensal.Month=mon.RecordId
                where(isnull(@EmpId,0)=0 or gensal.recordId=@EmpId)
                and(ISNULL(@MonthId,0)=0 or gensal.Month = @MonthId)
                and(ISNULL(@YearId,0)=0) or gensal.Year = @YearId;
    

    你可以像任何表一样调用它,使用你想要的所有聚合函数:

    SELECT * FROM dbo.GetSalaryReport(NULL,NULL,NULL);
    SELECT SUM(NetAmount) FROM dbo.GetSalaryReport(NULL,NULL,NULL);
    

    您甚至可以在连接或应用中使用它。

    编辑:如果您想/必须保留您的 SP,最好包装内联函数。这根本不会改变您的应用程序的行为:

    ALTER PROCEDURE [dbo].[SP_SearchSalaryReport]
    
        @EmpId int=null,
        @MonthId int=null,
        @YearId int=null
    AS
    BEGIN
    
    SET NOCOUNT ON;
    SELECT *
           --You could add your aggregate here, something like this
          --,(SELECT SUM(NetAmount) FROM dbo.GetSalaryReport(@EmpID,@MonthID,@YearID)) SumOfNetAmount
    FROM dbo.GetSalaryReport(@EmpID,@MonthID,@YearID);
    END
    

    【讨论】:

    • 先生,您上面的代码工作正常,但是当我通过实体框架将它与 winform 应用程序连接时,我无法获得总和值..
    • @SalamIndianoor,你尝试了什么?调用 SELECT SUM () 是一个标量调用。
    • 我试过这样--- select *from dbo.GetSalaryReport(@EmpId,@MonthId,@YearId) SELECT SUM(NetAmount) FROM dbo.GetSalaryReport(@EmpID,@MonthID,@YearID)任何问题..?这是在没有列名的情况下在 sql 中获取总和值,但在 c# 中没有获取,因为没有列名来指定 NetAmount
    • @SalamIndianoor,您是否知道 SUM 是一个标量聚合值?通常,您不应将结果集与聚合混合。您的 SUM 值将成为每一行的一部分,不知道您是否想要这个。在我的回答中,您会在最后找到可以用来将所有行与 SUM(称为 SumOfNetAmount)放在一起的调用,只需将第二条评论拿走。您给定的代码运行两个单独的查询...如果您需要列名,则必须使用 SELECT SUM(NetAmount) AS YourColumnName FROM...
    • @SalamIndianoor,还有一个提示:可能最好在没有 SUM 的情况下加载查询并在应用程序代码中计算 SUM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多