按时间顺序通过功能订购日期

时间:2014-04-27 22:43:42

标签: sql plsql

所以我创建了一个接受订单日期的函数,并将其作为订单下周的日期返回并测试它我已经编写了一个select语句来调用该函数。该函数与select语句一起使用但是我希望按时间顺序列出星期几的输出,即。周一,周二,周三......等等。因为现在它的输出我相信订单的顺序是......随机的。我该如何重写我的select语句?我尝试使用order by子句但它不断吐出不是一个表达式错误 ...到目前为止我的函数和select语句:

create or replace function DAY_ORD_SF
(dtcreated date)
return VARCHAR2

is

begin

    RETURN TO_CHAR(dtcreated,'DAY');
end;
/

这是我的选择声明:

SELECT day_ord_sf(dtcreated), count(*) as "Number of Orders"
  FROM BB_BASKET
  GROUP BY DAY_ORD_SF(DTCREATED)
  ORDER BY TO_CHAR(DTCREATED,'DAY') DESC;

有人可以用select语句帮我吗?我已尝试在小组之前和之后下订单,但仍然抛出错误。

2 个答案:

答案 0 :(得分:1)

如果您在select中调用此功能,请在group by order by中使用该功能:

SELECT day_ord_sf(dtcreated), count(*) as "Number of Orders"
FROM BB_BASKET
GROUP BY DAY_ORD_SF(DTCREATED)
ORDER BY TO_CHAR(MIN(DTCREATED), 'DAY') DESC;

您也可以通过在order by子句中包含group by表达式来执行此操作:

SELECT day_ord_sf(dtcreated), count(*) as "Number of Orders"
FROM BB_BASKET
GROUP BY DAY_ORD_SF(DTCREATED), TO_CHAR(DTCREATED,'DAY')
ORDER BY TO_CHAR(DTCREATED,'DAY') DESC;

答案 1 :(得分:0)

请勿使用此功能。

不要按字符串排序(例如TO_CHAR),它只会按字母顺序排序。

相反,您可以使用TRUNC将特定日期的所有记录分组在一起:

SELECT TO_CHAR(TRUNC(dtcreated),'DAY'), count(*) as "Number of Orders"
FROM BB_BASKET
GROUP BY TRUNC(dtcreated)
ORDER BY TRUNC(dtcreated) DESC;

这将按日期降序排序(最近的日期排在第一位)。