Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用一列的结果生成列名_Sql_Oracle_Pivot - Fatal编程技术网

Sql 使用一列的结果生成列名

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语句,类似于:

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)