从连接起始的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; 
+0

输出显示'2005 8' – DanSan

+0

我也试过了。 – DanSan

+0

输出显示'2005 8',而不是'200508','20058',也不是yyyy-mm-dd – DanSan

你有没有检查实际的结果呢?

当你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

+0

非常感谢,那些肯定会有更好的方法来达到我期待的结果。 – DanSan

+0

但是,仍然会匹配concatenate格式结果的最佳方式是什么?有什么方法可以将这些空白添加到条件中? – DanSan

+0

@DanSan:to_char(saledate,'yyyy mm')返回一个4位数的字符串,一个空格,两位数字前导零,所以'where yearmonth '2005 08''会匹配。如果你想要一个不同的字符串改变格式... – dnoeth