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