【发布时间】:2020-09-09 16:34:53
【问题描述】:
我已经在阳光下尝试了所有搜索来尝试解决这个问题,或者我没有正确搜索
我有一个带有子查询的查询,里面有 2 个联合查询
例子:-
SELECT name, status , SUM(TestCount) as ‘TestCount’
FROM(
select e1.reference as reference,
e1.name as name,
e1.status as status,
, SUM(CASE WHEN e1.date IS NOT NULL THEN 1 ELSE 0 END) as TestCount
FROM dbo.table1 as e1
WHERE e1.status IN('A','B','C')
GROUP BY e1.name, e1.status
UNION ALL
select e2.reference as reference,
e2.name as name,
e2.status as status,
SUM(CASE WHEN e2.date IS NOT NULL THEN 1 ELSE 0 END) as TestCount
FROM dbo.table2 as e2
WHERE e2.status IN('A','B','C')
GROUP BY e2.name, e2.status
) t
GROUP BY Name, Status
我想在我的子查询中添加一个 SUM CASE WHEN 列,然后在顶部将其拉出,仅按名称分组,而不是状态。 (因此,如果一个人的名字出现 5 次以获得 5 种不同的状态',则只需为他们的名字显示相同的数字 5 次)。问题是,如果我使用 WHERE 子句(内部)或 HAVING 外部,它会过滤掉具有最后一列的 SUM CASE WHEN 条件的状态
例如
状态:-
一个 乙 C D E - 这里是总和案例的来源
我想使用 WHERE 仅显示 A 、 B 、 C 、 D ,但我想计算 E..
希望这是有道理的
根据建议编辑:-
SUM(CASE WHEN MONTH(Field1Date) = MONTH(GETDATE()) AND YEAR(Field1Date) = YEAR(GETDATE()) AND TypeCode IN('A', 'B', 'C') THEN 1
ELSE 0 END) OVER (PARTITION BY Name) as full_count
这会导致:-
Msg 8120, Level 16, State 1, Line 1
Column 't.Field1Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 1
Column 't.Field1Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 1
Column 't.TypeCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 1
Column 't.TypeCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 1
Column 't.TypeCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
这样做然后将错误减少到2:-
SUM(CASE WHEN MONTH(Field1Date) = MONTH(GETDATE()) AND YEAR(Field1Date) = YEAR(GETDATE()) AND TypeCode IN('A', 'B', 'C') THEN 1
ELSE 0 END) OVER (PARTITION BY Name, Field1Date, TypeCode) as full_count
Msg 8120, Level 16, State 1, Line 2
Column 't.Field1Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 2
Column 't.TypeCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我可以通过将最后 2 个错误添加到 GROUP BY 来消除它们,但如果这有意义的话,我不想一开始就对它们进行 GROUP BY?
如果我将它们添加到 GROUP BY 以克服错误,则 SUM 始终为 0,因为内部查询中的 WHERE 语句会过滤掉计数所在的所有“状态”
对不起,我应该说这是 SQL Server。 SSMS 中的 TSQL
【问题讨论】:
-
SELECT name, status , SUM(TestCount) -
@jarlh 但它不会显示,因为使用 WHERES 过滤掉了 TestCount,因为并非所有状态都需要显示
-
您使用的是什么 DBMS?请始终使用您想要回答的 DBMS 标记 SQL 问题。在您的 TestCount 别名周围有一些反引号,其中标准 SQL 需要双引号。这可能表示 MySQL。然后,您可以从 SQL Server 的典型 dbo 架构中进行选择。不同的 DBMS 具有不同的功能,因此了解您使用的是哪一个对我们来说很重要。我在回答中使用了标准 SQL 查询。希望这对你有用。
标签: sql sql-server