【发布时间】:2017-11-01 21:07:54
【问题描述】:
我有一段代码想变成一个函数。代码的目的是根据可变标准将某些记录分组在一起,并使用 STUFF() 创建分组串联。我希望能够切换发生分组的参数(因此还有 STUFF 的参数)。
但是,如果可选参数(例如以下示例中的 OwnerName)在选择列表中无效,则以下错误会导致我出现错误,因为它们既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
考虑一个像下面这样的简化示例(现实生活中的版本有很多参数,因此我希望能够将这些都集中到一个查询中):
SELECT CarMake, CarModel, CASE WHEN @FlagOwnerName = 1 THEN OwnerName ELSE NULL END AS [OwnerName], SUM(CarValue),
LicenseIDs = STUFF((SELECT ',' + CONVERT(VARCHAR(20),Cars2.LicenseID) AS [text()]
FROM DB.dbo.Cars Cars2
WHERE Cars2.CarMake = Cars1.CarMake
AND Cars2.CarModel = Cars1.CarModel
AND (@FlagOwnerName = 0 OR Cars2.OwnerName = Cars1.OwnerName)
FOR XML PATH('')), 1, 1, '')
FROM DB.dbo.Cars Cars1
GROUP BY CarMake,
CarModel,
CASE WHEN @FlagOwnerName = 1 THEN OwnerName ELSE NULL END
编辑:如果我更改以下内容,那么它“似乎”返回正确的串联,除非它是 NULL,那么串联本身就是 NULL。此外,如果我尝试将值更改为 ISNULL(Cars1.OwnerName, 'Placeholder') 或类似地使用 COALESCE,它会给我同样的错误(在上面的 select 语句中无效)。
AND (@FlagOwnerName = 0 OR Cars2.OwnerName = Cars1.OwnerName)
到
AND CASE WHEN @FlagOwnerName = 1 THEN Cars1.OwnerName = Cars2.OwnerName
【问题讨论】:
-
您的意思是要使用 CREATE FUNCTION 语句创建一个实际的 SQL Server 函数吗?或者您只是想在您的 SELECT 语句中内联执行此操作?了解您使用的 SQL Server 版本也会有所帮助。
-
抱歉不清楚,这将是重复调用的存储过程的一部分。该数据库位于 SQL Server 2008 上。
-
我认为您可能需要更多地解释一下您正在尝试做什么 - 您期望“LicenseIDs”的数据是什么?在 XML 上使用 STUFF 函数的目的是什么?您是否希望 Cars1 到 Cars2 是一对多的关系?
-
Cars2 到 Cars1 应该是一对一的,并且 XML 路径上的 STUFF 应该连接每个品牌和型号的所有 LicenseID。一个示例输出行是,假设每个 Toyota Camry 的价值为 20,000。当 FlagOwnerName = 0 时:丰田 |凯美瑞 | 40,000 | LICENSE1,LICENSE2 但是当 FlagOwnerName = 1 然后是 Toyota |凯美瑞 |所有者1 | 20,000 | LICENSE1(以及 Owner2 的第二行,LICENSE2)。
标签: sql-server join group-by conditional