你可以使用条件聚合比如
SELECT Employee, SUM(CASE WHEN day = date'2020-10-14' THEN 1 ELSE 0 END) AS "14/10",
SUM(CASE WHEN day = date'2020-10-15' THEN 1 ELSE 0 END) AS "15/10",
SUM(CASE WHEN day = date'2020-10-16' THEN 1 ELSE 0 END) AS "16/10"
FROM t
GROUP BY Employee
或PIVOT子句如
SELECT Employee, SUM("14/10") AS "14/10",
SUM("15/10") AS "15/10",
SUM("16/10") AS "16/10"
FROM t
PIVOT
(
COUNT(*) FOR day IN (date'2020-10-14' AS "14/10",
date'2020-10-15' AS "15/10",
date'2020-10-16' AS "16/10")
)
GROUP BY Employee
为了以静态方式旋转您的结果,例如,在这两种情况下,您都必须将所有列添加到查询中,无论需要哪个日期值。相反,您可以使用包含SYS_REFCURSOR 的函数,例如
CREATE OR REPLACE FUNCTION Get_Transactions_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG( 'SUM(CASE WHEN day = '''||day||'''
THEN 1 ELSE 0
END) AS "'||TO_CHAR(day,'dd/mm')||'"' , ',' )
WITHIN GROUP ( ORDER BY day )
INTO v_cols
FROM (
SELECT DISTINCT day
FROM t
);
v_sql :=
'SELECT Employee, '|| v_cols ||'
FROM t
GROUP BY Employee';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
/
然后从 SQL Developer 的控制台调用,以返回每天旋转的事务数:
SQL> DECLARE
v_transactions SYS_REFCURSOR;
BEGIN
:v_transactions := Get_Transactions_RS;
END;
/
SQL> PRINT v_transactions ;