过滤不在选择中的列值
Posted
技术标签:
【中文标题】过滤不在选择中的列值【英文标题】:Filter on column values not in select 【发布时间】:2018-11-26 21:46:49 【问题描述】:我正在尝试对两个表进行连接并筛选不在我的 select 语句中的值。
以下查询不起作用。
select b.[[Product]].[Major Category]]] ,sum(a.BIC_ZCDP) from TEMP_FORECAST_ALL a
join OUT_Dimension_DP_Product b
on right(a.MATERIAL,10) = b.[[Product]].[10D]]]
join OUT_Dimension_DP_Market c
on a.BIC_ZRMARKET = c.[[Market]].[Market]]]
group by b.[[Product]].[Major Category]]]
having a.CALMONTH in ('201810','201811','201812') and c.[[Market]].[Region]]] = 'UK'
我收到以下错误
消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的列 'OUT_Dimension_DP_Market.[Market].[Region]' 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我不想在我的 group by 子句中添加 Region 和 CALMONTH。
【问题讨论】:
稍微绕道,但您可能应该阅读一些内容。 sqlblog.org/2009/10/08/… 【参考方案1】:使用WHERE
子句。 . . :
select p.[[Product]].[Major Category]]], sum(a.BIC_ZCDP)
from TEMP_FORECAST_ALL a join
OUT_Dimension_DP_Product p
on right(a.MATERIAL,10) = b.[[Product]].[10D]]] join
OUT_Dimension_DP_Market m
on a.BIC_ZRMARKET = m.[[Market]].[Market]]]
where a.CALMONTH in ('201810', '201811', '201812') and
m.[[Market]].[Region]]] = 'UK'
group by p.[[Product]].[Major Category]]];
【讨论】:
【参考方案2】:having
仅用于聚合。由于这只是简单的比较,因此您希望它们在 where
子句中。例如,如果您要与 sum
或其他聚合进行比较,您会使用 having
。
【讨论】:
【参考方案3】:Having子句在我们使用聚合函数时使用,但这里你只是做比较,所以你必须使用where子句。
【讨论】:
【参考方案4】:当您过滤聚合数据时使用 HAVING 子句,即,如果您想过滤 SUM 语句的结果,如下所示:
HAVING SUM(a.BIC_ZCDP) > 0
但是,出于查询的目的,您只需将HAVING
切换为WHERE
,这样...
SELECT
b.[[Product]].[Major Category]]],
SUM(a.BIC_ZCDP)
FROM
TEMP_FORECAST_ALL a
INNER JOIN OUT_Dimension_DP_Product b ON right(a.MATERIAL,10) = b.[[Product]].[10D]]]
INNER JOIN OUT_Dimension_DP_Market c ON a.BIC_ZRMARKET = c.[[Market]].[Market]]]
WHERE
(a.CALMONTH IN ('201810','201811','201812')) AND (c.[[Market]].[Region]]] = 'UK')
GROUP BY
b.[[Product]].[Major Category]]]
同样,HAVING
子句允许您过滤已为 AGGREGATED (SUM, MAX, MIN, etc.)
的字段,而 WHERE
子句允许您过滤普通字段。
【讨论】:
以上是关于过滤不在选择中的列值的主要内容,如果未能解决你的问题,请参考以下文章