Sql 使用一列的结果生成列名
我有select语句,类似于:Sql 使用一列的结果生成列名,sql,oracle,pivot,Sql,Oracle,Pivot,我有select语句,类似于: select trim(time), type, count(1) from table group by trim(time),type select ?SOMETHING? from ( select trim(time), type, count(1) from table group by trim(time),type) s 结果是
select trim(time), type, count(1) from table
group by trim(time),type
select ?SOMETHING?
from (
select trim(time), type, count(1)
from table
group by trim(time),type) s
结果是:
02.10.13 REZ1 1
02.10.13 REZ2 5
02.10.13 REZ3 3
是否可以使用某些Oracle函数生成一些select语句以获得以下结果:
REZ1 REZ2 REZ3
1 5 3
因此,一列的结果是另一个语句中的列名,类似于:
select trim(time), type, count(1) from table
group by trim(time),type
select ?SOMETHING?
from (
select trim(time), type, count(1)
from table
group by trim(time),type) s
也许您可以为此尝试SQL替代方案:
SELECT MAX(CASE type
WHEN 'REZ1' THEN cnt
ELSE NULL
END) AS REZ1,
MAX(CASE type
WHEN 'REZ2' THEN cnt
ELSE NULL
END) AS REZ2,
MAX(CASE type
WHEN 'REZ3' THEN cnt
ELSE NULL
END) AS REZ3
FROM (SELECT trim(time), type, count(1) as cnt FROM table
GROUP BY trim(time), type);
或者更好:
SELECT COUNT(CASE type
WHEN 'REZ1' THEN 1
ELSE NULL
END) AS REZ1,
COUNT(CASE type
WHEN 'REZ2' THEN 1
ELSE NULL
END) AS REZ2,
COUNT(CASE type
WHEN 'REZ3' THEN 1
ELSE NULL
END) AS REZ3
FROM table;
输出:
REZ1 | REZ2 | REZ3
1 | 5 | 3
当您知道“类型”列中的值时,此选项适用。即使是在11g中可用的pivot,也要求您知道列中的值,以便按照ajmalmhd04的回答中所述进行pivot。假设第二列没有除REZ1..3以外的任何值,则以下解决方案将转置表数据,并通过将值相加来处理重复
WITH t(l_date, val, l_count)
AS
(SELECT to_date('02.10.13', 'dd.mm.yy'), 'REZ1' , 1 FROM dual UNION
SELECT to_date('02.10.13', 'dd.mm.yy'), 'REZ2' , 5 FROM dual UNION
SELECT to_date('02.10.13', 'dd.mm.yy'), 'REZ3' , 3 FROM dual
)
SELECT *
FROM
( SELECT val, l_count FROM t
) PIVOT (MAX(l_count) FOR (val) IN ('REZ1' REZ1,'REZ2' REZ2 ,'REZ3' REZ3));
WITH t
AS (SELECT TO_DATE ('02.10.13', 'dd.mm.yy') AS dt,
'REZ1' AS typ,
1 AS cnt
FROM DUAL
UNION
SELECT TO_DATE ('02.10.13', 'dd.mm.yy') AS dt,
'REZ2' AS typ,
5 AS cnt
FROM DUAL
UNION
SELECT TO_DATE ('02.10.13', 'dd.mm.yy') AS dt,
'REZ3' AS typ,
3 AS cnt
FROM DUAL
UNION
SELECT TO_DATE ('03.10.13', 'dd.mm.yy') AS dt,
'REZ1' AS typ,
7 AS cnt
FROM DUAL
UNION
SELECT TO_DATE ('03.10.13', 'dd.mm.yy') AS dt,
'REZ2' AS typ,
2 AS cnt
FROM DUAL)
SELECT dt,
SUM (CASE WHEN typ = 'REZ1' THEN cnt ELSE 0 END) AS "REZ1",
SUM (CASE WHEN typ = 'REZ2' THEN cnt ELSE 0 END) AS "REZ2",
SUM (CASE WHEN typ = 'REZ3' THEN cnt ELSE 0 END) AS "REZ3"
FROM t
GROUP BY dt;
DT REZ1 REZ2 REZ3
--------- ---------- ---------- ----------
02-OCT-13 1 5 3
03-OCT-13 7 2 0
2 rows selected.
在column2将有随机值的情况下,可能需要使用某种游标来调整此查询以考虑动态列。
如果我能够设计出它,我会尝试发布它。根据您使用的Oracle版本,pivot可能是可用的。请参阅Tim Hall优秀网站上的这篇文章:
select trim(time),
count(decode(type, 'REZ1', 1)) AS REZ1,
count(decode(type, 'REZ2', 1)) AS REZ2,
count(decode(type, 'REZ3', 1)) AS REZ3
from table
group by trim(time)