您试图按data
进行分组,这是在同一级别的查询中定义的列别名,因此将生成ORA-00904: "DATA": invalid identifier
。
您正在将日期转换为字符串(出于某种原因,为两位数字年)并与另一个字符串进行比较,无论如何这不是一个好主意 - 如果日期列被索引,则将其转换为字符串可防止索引用于比较,通常比较原始数据类型更有意义,效率更高。但字符串以不同的格式结束 - 一个有几分钟,另一个不是。
您的内部查询将日期转换为字符串,并对结果进行排序;这表明这是您现在正试图总结的现有查询。顺序是毫无意义的,不会影响外部查询中结果的顺序。
如果你真的想坚持一个字符串中的内部查询,你可以使用一个子,只要日期格式是合适的,并使用该子串组,由太:
SELECT EQUIPA, COUNT(*) TOTAL, substr(DATAD, 1, 8) Data FROM
(
... -- original inner query
) GROUP BY EQUIPA, substr(DATAD, 1, 8)
或转换回一个日期,然后为一个字符串又和组由太,这是做更多的工作比你需要的,但在逻辑上是在使用转换后的日期是什么您最初试图做的事:
SELECT EQUIPA, COUNT(*) TOTAL,
to_char(to_date(DATAD, 'YY.MM.DD HH24'), 'YY.MM.DD') Data FROM
(
... -- original inner query
) GROUP BY EQUIPA, to_date(DATAD, 'YY.MM.DD HH24')
或更改内部查询以返回原始日期而不是字符串;尽管内部查询根本不需要:
SELECT EQUIPA, COUNT(*) TOTAL, to_char(TRUNC(OS_DATACONCLUSAO), 'YY.MM.DD') Data
FROM OS_CRM_DB_FINAL
WHERE USERFECHO IS NOT null
AND EQUIPA = 'AAA'
AND OS_DATACONCLUSAO >= TO_DATE('2016.11.03 17:07:00', 'YYYY.MM.DD HH24:MI:SS')
AND OS_DATACONCLUSAO <= TO_DATE('2016.11.15 17:07:00', 'YYYY.MM.DD HH24:MI:SS')
GROUP BY EQUIPA, TRUNC(OS_DATACONCLUSAO)
ORDER BY EQUIPA, TRUNC(OS_DATACONCLUSAO) DESC
我已经更改了过滤器来比较日期而不是字符串。日期只在最后一刻转换为字符串才能显示。另请注意,我已按截断日期排序(默认情况下,该日期会将时间设置为午夜)。您可以在顺序中使用data
列别名(但不会在其他地方),在这种情况下,它可以正常使用;但是如果您在结果集中设置了不同的日期格式,例如MM/DD/YYYY你想按日期排序而不是字符串。
你不能 - 你需要转换回日期然后回到一个字符,或者你需要对字符串进行字符串处理以获得你需要的结果。我更喜欢第一到第二,因为它更明显。 – Ben
尝试将字符串转换为字符串不计算。改用一个子串。 –