最简单的方法是使用多个子查询:
SELECT
(SELECT COUNT(*) FROM employee WHERE gender = F AND age<30) AS 'Female Below 30',
(SELECT COUNT(*) FROM employee WHERE gender = F AND age>=30) AS 'Female Above 30',
(SELECT COUNT(*) FROM employee WHERE gender = M AND age<30) AS 'Male Below 30',
(SELECT COUNT(*) FROM employee WHERE gender = M AND age>=30) AS 'Male Above 30'
我认为在这种情况下使用 PIVOT 更好:
SELECT [FB30],
[FA30],
[MB30],
[MA30]
FROM (
SELECT empname,
gender + CASE WHEN age<30 THEN 'B30' ELSE 'A30' END AS SexAge
FROM Employee
) AS SourceTable
PIVOT
(
COUNT(empname)
FOR SexAge IN ([FB30],[FA30],[MB30],[MA30])
) AS PivotTable;
看看这个SQL SERVER Fiddle Demo
经过一番搜索(我没有进入 Oracle ......)我最终得到了 PIVOT:
WITH
T
AS
(
SELECT "empname" ,
"gender" || CASE WHEN "age"<30 THEN 'B30' ELSE 'A30' END AS "SexAge"
FROM Employee
)
SELECT
SUM(FB30) AS FB30,SUM(FA30) AS FA30,SUM(MB30) AS MB30,SUM(MA30) AS MA30
FROM
T
PIVOT
(
COUNT(*)
FOR
("SexAge")
IN
('FB30' AS FB30,'FA30' AS FA30,'MB30' AS MB30,'MA30' AS MA30)
);
Oracle PIVOT Demo
既然您要求提供DECODE 示例:
WITH
T
AS
(
SELECT "empname" ,
"gender" || DECODE(TRUNC("age"/30),0,'B30','A30') AS "SexAge"
FROM Employee
)
SELECT
SUM(FB30) AS FB30,SUM(FA30) AS FA30,SUM(MB30) AS MB30,SUM(MA30) AS MA30
FROM
T
PIVOT
(
COUNT(*)
FOR
("SexAge")
IN
('FB30' AS FB30,'FA30' AS FA30,'MB30' AS MB30,'MA30' AS MA30)
);
Oracle DECODE PIVOT Demo