T-SQL编程Returntable基于变量

T-SQL Programming Return table based on Variable

我已经尝试了一段时间,但我不知道哪里出了问题。

函数需要根据输入的日期return一个table。如果数据库中没有输入的年份,函数需要return所有年份的数据,否则,它只需要return指定年份的数据。

也许这里有人可以提供帮助。 我正在使用 2014 AdventureWorks 数据库。

谢谢

CREATE FUNCTION DBO.udf_fonction(@year INT)

RETURNS TABLE

AS

RETURN 

IF @year IN (SELECT DISTINCT(YEAR(OrderDate)) AS Years
         FROM Sales.SalesOrderHeader)

(
    SELECT YEAR(A.OrderDate) AS SalesYear,
    C.Name AS SalesTerritory, 
    D.Name AS SalesCountryName, 
    CASE(A.OnlineOrderFlag)
        WHEN 1 THEN 'Online'
        WHEN 0 THEN 'In-store'
    END AS SalesType,
    SUM(A.SubTotal) AS Montant

    FROM sales.SalesOrderHeader A
    INNER JOIN Sales.Customer B ON A.CustomerID = B.CustomerID
    INNER JOIN Sales.SalesTerritory C ON B.TerritoryID = C.TerritoryID
    INNER JOIN Person.CountryRegion D ON C.CountryRegionCode = D.CountryRegionCode
    WHERE YEAR(A.OrderDate) = @year
    GROUP BY YEAR(A.OrderDate), C.Name, D.Name, CASE(A.OnlineOrderFlag)
                                                    WHEN 1 THEN 'Online'
                                                    WHEN 0 THEN 'In-store'
                                                END
                                                )
ELSE (SELECT YEAR(A.OrderDate) AS SalesYear,
    C.Name AS SalesTerritory, 
    D.Name AS SalesCountryName, 
    CASE(A.OnlineOrderFlag)
        WHEN 1 THEN 'Online'
        WHEN 0 THEN 'In-store'
    END AS SalesType,
    SUM(A.SubTotal) AS Montant

    FROM sales.SalesOrderHeader A
    INNER JOIN Sales.Customer B ON A.CustomerID = B.CustomerID
    INNER JOIN Sales.SalesTerritory C ON B.TerritoryID = C.TerritoryID
    INNER JOIN Person.CountryRegion D ON C.CountryRegionCode = D.CountryRegionCode
    GROUP BY YEAR(A.OrderDate), C.Name, D.Name, CASE(A.OnlineOrderFlag)
                                                    WHEN 1 THEN 'Online'
                                                    WHEN 0 THEN 'In-store'
                                                END
                                                )
GO
WHERE YEAR(A.OrderDate) = @year 
   OR not exists (select 1 from sales.SalesOrderHeader where YEAR(OrderDate) = @year)

您不会在任何地方返回 table