2015-11-03 91 views
0

我有这个疑问:SQL一行输出

SELECT Count(*) AS GesamtanzahlMitarbeiter, 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%80') AS "1980", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%81') AS "1981", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%82') AS "1982", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%83') AS "1983" 
FROM EMP 
GROUP BY DEPTNO; 

而且我得到这样的输出:

GESAMTANZAHLMITARBEITER  1980  1981  1982  1983 
----------------------- ---------- ---------- ---------- ---------- 
         6   1   10   2   1 
         5   1   10   2   1 
         3   1   10   2   1 

现在问题的关键是,我不要想组DEPTNO。我想组所有这些,指望所有的“GESAMTANZAHLMITARBEITER”是这样的:

GESAMTANZAHLMITARBEITER  1980  1981  1982  1983 
----------------------- ---------- ---------- ---------- ---------- 
        14   1   10   2   1 

但我不能GROUP BY *或东西.. 一种解决方法是给他们都具有相同的值的新属性,按该属性分组,但那只是不正确。

我不知道该怎么做......

+0

只是删除分组.. –

+0

然后我收到错误信息,它似乎需要分组,如果你使用count() – jochot

回答

4

使用条件的聚集,在SUM

SELECT 
    COUNT(*) as GesamtanzahlMitarbeiter, 
    SUM(CASE WHEN HIREDATE LIKE '%80'THEN 1 ELSE 0) as "1980", 
    SUM(CASE WHEN HIREDATE LIKE '%81'THEN 1 ELSE 0) as "1981", 
    SUM(CASE WHEN HIREDATE LIKE '%82'THEN 1 ELSE 0) as "1982", 
    SUM(CASE WHEN HIREDATE LIKE '%83'THEN 1 ELSE 0) as "1983" 
FROM EMP 

注意添加case如果添加GROUP BY到这个查询,你会得到COUNT(*)每个emp在您先前的查询中,您将获得每行中所有表的COUNT(*)

+0

谢谢!我知道它不会用Group By这样的方式解决.. :) – jochot

1

您可以使用count没有group by这样的:

SELECT 
(SELECT Count(*) FROM EMP) AS GesamtanzahlMitarbeiter, 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%80') AS "1980", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%81') AS "1981", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%82') AS "1982", 
(SELECT Count(*) FROM EMP WHERE HIREDATE LIKE '%83') AS "1983" 
FROM DUAL; 
0

这个怎么样(假设一个比较新的Oracle版本):

with pivot_data as 
    (select to_number(to_char(hiredate,'YYYY')) as year 
     from emp) 
    , pivotted as 
    (select * 
     from pivot_data pd 
     pivot (count(year) for year in (1980, 1981, 1982, 1983))) 
    , totals as 
    (select count(*) as GesamtanzahlMitarbeiter from pivot_data) 
select t.GesamtanzahlMitarbeiter 
    , p.* 
from pivotted p cross join totals t;