SQL函数返回有关子查询的错误

时间:2018-01-05 10:51:06

标签: sql sql-server

早上好,

我正在尝试制作收入视图,但由于我无法解决的错误而陷入困境。 我已经完成了一项功能,可以从配件和自行车中获得总收入。该函数将这些结合起来,每月给出一个结果,即变量。我尝试了单独的查询,它们似乎正常工作。发生以下情况,我似乎错过了一个步骤,我想:

    CREATE FUNCTION fnOmzetPMaand
    (
        @Maand AS int
    )
    RETURNS int
    AS
    BEGIN

    DECLARE @AccOmzet AS int

    SET @AccOmzet = (
    SELECT dbo.fnOmzet(SUM(a.Accessoire_Dagprijs), h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum)
    FROM Huurovereenkomst h
        INNER JOIN HuurovereenkomstAccessoire ha
        ON ha.HuurovereenkomstAccessoire_Huurovereenkomst_id = h.Huurovereenkomst_id
        INNER JOIN Accessoire a
        ON a.Accessoire_id = ha.HuurovereenkomstAccessoire_Accessoire_id
        WHERE MONTH(h.Huurovereenkomst_Betaal_datum) = @Maand
        GROUP BY h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum
        )

    DECLARE @FietsOmzet AS int

    SET @FietsOmzet = (
    SELECT dbo.fnOmzet(SUM(f.Fiets_Dagprijs), h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum)
    FROM Huurovereenkomst h
        INNER JOIN HuurovereenkomstFiets hf
        ON hf.HuurovereenkomstFiets_Huurovereenkomst_id = h.Huurovereenkomst_id
        INNER JOIN Fiets f
        ON f.Fiets_id = hf.HuurovereenkomstFiets_Fiets_id
        WHERE MONTH(h.Huurovereenkomst_Betaal_datum) = @Maand
        GROUP BY h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum
        )

    RETURN @FietsOmzet + @AccOmzet
    END

观点:

    CREATE VIEW vOmzetPMaand
    AS
    SELECT DATENAME(MONTH, Huurovereenkomst_Betaal_datum) Maand,
    dbo.fnOmzetPMaand(MONTH(Huurovereenkomst_Betaal_datum)) Omzet
    FROM Huurovereenkomst

错误:

    Msg 512, Level 16, State 1, Line 43
    Subquery returned more than 1 value. This is not permitted when the 
    subquery follows =, !=, <, <= , >, >= or when the subquery is used as an 
    expression.

预期结果:

   May  100
   June 200
   July 150
   etc etc.

    USE [Biker]
    GO
    /****** Object:  UserDefinedFunction [dbo].[fnOmzet]    Script Date: 05-Jan-18 12:05:50 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER FUNCTION [dbo].[fnOmzet]
        (
            @Bedrag AS int,
            @BeginDatum AS DATETIME,
            @EindDatum AS DATETIME
        )
    RETURNS int
    AS
    BEGIN

        RETURN @Bedrag * DATEDIFF(Y, @BeginDatum, @EindDatum)

    END

1 个答案:

答案 0 :(得分:0)

哟有两个子查询,但两者都使用相同的表并按相同的标准分组。

在没有查看数据集的情况下,我会说,因为预期结果是按月汇总的(根据您的问题):影响数据很可能是您拥有多个&#34; h.Huurovereenkomst_Begin_datum的组合, h.Huurovereenkomst_Eind_datum&#34;每月。如果是这种情况,并且由于这些列值已分组但未聚合,则它们将返回多行。

以下是我到目前为止可以想到的一些选项:

选项1.在min和max这两个字段上使用聚合函数(如果业务逻辑允许它以获取单个记录。

选项2.处理每个结果的多行并保证单个结果值。 (这可以通过多个解决方案来实现,这些解决方案可以来自带有select语句的额外子查询,甚至可以返回类似表变量的表结构上的值,然后执行额外处理以仅返回多行上的最终值)

选项3.以某种方式从组合中提取相关月份&#34; h.Huurovereenkomst_Begin_datum,h .Huurovereenkomst_Eind_datum&#34;并按月分组而不是您当前的分组。

重要提示:如果业务规则允许,我会更喜欢选项#3或其中的一些变体。