从连接起始的Teradata/SQL语句中过滤出一个组合
问题描述:
我将日期的年和月值连接起来,我想用HAVING语句从输出中排除一个组合。但是,它仍然显示出来。 !从连接起始的Teradata/SQL语句中过滤出一个组合
SELECT EXTRACT(YEAR from saledate) || EXTRACT(MONTH from saledate) AS yearmonth, SUM(amt)
FROM trnsact
GROUP BY yearmonth
HAVING yearmonth<>'2005 8'
;
我开始使用=在HAVING语句,但是在Teradata的文档,建议使用下列任何一种:
<>
^=
NE
NOT=
我已经试过所有的人都和组,我试图排除仍然显示。我也尝试使用WHERE语句。
我知道我可以避免连接,只是创建两个条件,但我想明白为什么这条路线不工作,并希望修复它!
为什么WHERE或HAVING不能过滤掉连接?
答
实际上,在where
子句(聚合之前)中执行此操作比在having
子句中执行此操作更好。所以,仅仅使用extract
值或日期计算:
SELECT EXTRACT(YEAR from saledate) || EXTRACT(MONTH from saledate) AS yearmonth,
SUM(amt)
FROM trnsact
WHERE EXTRACT(YEAR from saledate) <> 2005 or EXTRACT(MONTH from saledate) <> 8
GROUP BY monthyear;
我认为这是更自然的书写:
SELECT EXTRACT(YEAR from saledate) || EXTRACT(MONTH from saledate) AS yearmonth,
SUM(amt)
FROM trnsact
WHERE saledate < date '2005-08-01' or saledate >= '2005-09-01'
GROUP BY monthyear;
答
你有没有检查实际的结果呢?
当你Concat的两个数值有使用默认FORMAT
隐式(自动)类型转换为字符串:
SELECT '#' || EXTRACT(YEAR FROM DATE) || EXTRACT(MONTH FROM DATE) || '#'
回报
# 2016 2#
那些多余的空格都基于默认FORMAT
的整数。
得到extpected结果最简单的方法是添加一个明确的转换:
SELECT to_char(saledate, 'yyyy mm')
但是为什么你要一个字符串输出?无论是两列
SELECT EXTRACT(YEAR from saledate), EXTRACT(MONTH from saledate)
或整数更高效:
SELECT EXTRACT(YEAR from saledate) * 100 + EXTRACT(MONTH from saledate) AS yearmonth
当然,你更好的移动状态为WHERE
,而不是HAVING
。
输出显示'2005 8' – DanSan
我也试过了。 – DanSan
输出显示'2005 8',而不是'200508','20058',也不是yyyy-mm-dd – DanSan