我收到以下错误消息;
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
我遇到问题的代码部分是在我的选择声明中;
,(SELECT COUNT(sch.startdate)
FROM #test AS sch
WHERE L.Id = sch.id
GROUP BY sch.id, sch.startdate
HAVING sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC
目前,如果此人在测试临时表中只有一条记录,但在有两条记录时分崩离析,则它可以正常工作。我知道我可以使用Top 1来限制它,但这不是我想要的。 L
来自主要的选择语句。
好的,临时表有以下数据:
ID startdate
1 2014-10-02
1 2014-11-02
2 2014-11-02
在我的代码中使用TOP 1,我得到以下结果:
ID ~Other Stuff~ SC
1 ~~~~~~~~~~~~~ 1
2 ~~~~~~~~~~~~~ 1
但我想要归还的是:
ID ~Other Stuff~ SC
1 ~~~~~~~~~~~~~ 2
2 ~~~~~~~~~~~~~ 1
如何修改我的代码才能实现这一目标?
感谢。
答案 0 :(得分:0)
从GROUP BY中删除sch.startdate
。您想要计算StartDates,而不是Group By它们。
答案 1 :(得分:0)
这取决于你想要计算什么。它也会出现(没有附加信息)您可以将HAVING子句移动到WHERE子句中。
如果您尝试计算#test匹配的行:
,(SELECT COUNT(*)
FROM #test AS sch
WHERE L.Id = sch.id
AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC
如果您尝试计算唯一的startdate值:
,(SELECT COUNT(DISTINCT sch.startdate)
FROM #test AS sch
WHERE L.Id = sch.id
AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC
如果您尝试计算(id,startdate)的唯一组合,那么我认为您需要另一级别的查询:
,(SELECT COUNT(*) FROM (
SELECT sch.id, sch.startdate
FROM #test AS sch
WHERE L.Id = sch.id
AND sch.startdate >= L.T_Start AND sch.startdate <= @END
GROUP BY sch.id, sch.startdate)
AS X) AS SC
答案 2 :(得分:0)
HAVING用于过滤掉整个组中某些条件为真的组。通常,这是您的分组中的一些汇总,例如
HAVING sum(amount) > 10
你把
HAVING sch.startdate >= L.T_Start --...
将L.T_start拉到行级别(因为它不是聚合而不是你的GROUP BY)。
根据您的目的,
将其移至WHERE子句(以从语句预分组中过滤行)
或
使其成为聚合(例如,HAVING max(sch.startdate&gt; L.T_start)等。
或
按该条件分组,例如 通过...分组 - ......, 当sch.startdate&gt;时的情况L.T_start然后1其他0结束 - ...... 请注意,最后一个选项可以为您提供两个组,因此您还应该将该CASE语句作为选择列表中的列包含以识别差异。