Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Select - Fatal编程技术网

Sql 加入几个选择

Sql 加入几个选择,sql,oracle,select,Sql,Oracle,Select,我有这样的桌子,假的: data: id type month value 1 1 1 10 2 1 2 20 3 1 3 30 4 2 1 40 5 2 2 50 6 2 3 60 7 3 1 70 8 3

我有这样的桌子,假的:

data:
    id  type    month   value
    1   1       1       10
    2   1       2       20
    3   1       3       30
    4   2       1       40
    5   2       2       50
    6   2       3       60
    7   3       1       70
    8   3       2       80
    9   3       3       90
    10  4       1       100
    11  4       2       110
    12  4       3       120

type:
    id  name
    1   A
    2   B
    3   C
    4   D

What I want:
    month   valueA  valueB  valueC  valueD
    1       10      40      70      100
    2       20      50      80      110
    3       30      60      90      120
我如何进行此查询?
我正在使用Oracle 10g。

看起来您需要一个相对简单的数据透视。如果您使用的是11g,则可以使用更优雅的PIVOT函数。但在10g中,您仍然可以这样做

SQL> ed
Wrote file afiedt.buf

  1  with data as (
  2    select 1 id, 1 type, 1 month, 10 value from dual union all
  3    select 2,1,2,20 from dual union all
  4    select 3,1,3,30 from dual union all
  5    select 4,2,1,40 from dual union all
  6    select 5,2,2,50 from dual union all
  7    select 6,2,3,60 from dual union all
  8    select 7,3,1,70 from dual union all
  9    select 8,3,2,80 from dual union all
 10    select 9,3,3,90 from dual union all
 11    select 10,4,1,100 from dual union all
 12    select 11,4,2,110 from dual union all
 13    select 12,4,3,120 from dual
 14  ),
 15  type as (
 16    select 1 id, 'A' name from dual union all
 17    select 2,'B' from dual union all
 18    select 3,'C' from dual union all
 19    select 4,'D' from dual)
 20  select d.month,
 21         max(case when t.name = 'A' then d.value else null end) valueA,
 22         max(case when t.name = 'B' then d.value else null end) valueB,
 23         max(case when t.name = 'C' then d.value else null end) valueC,
 24         max(case when t.name = 'D' then d.value else null end) valueD
 25    from data d,
 26         type t
 27   where d.type = t.id
 28*  group by d.month
SQL> /

     MONTH     VALUEA     VALUEB     VALUEC     VALUED
---------- ---------- ---------- ---------- ----------
         1         10         40         70        100
         2         20         50         80        110
         3         30         60         90        120

看起来您需要一个相对简单的数据透视。如果您使用的是11g,则可以使用更优雅的PIVOT函数。但在10g中,您仍然可以这样做

SQL> ed
Wrote file afiedt.buf

  1  with data as (
  2    select 1 id, 1 type, 1 month, 10 value from dual union all
  3    select 2,1,2,20 from dual union all
  4    select 3,1,3,30 from dual union all
  5    select 4,2,1,40 from dual union all
  6    select 5,2,2,50 from dual union all
  7    select 6,2,3,60 from dual union all
  8    select 7,3,1,70 from dual union all
  9    select 8,3,2,80 from dual union all
 10    select 9,3,3,90 from dual union all
 11    select 10,4,1,100 from dual union all
 12    select 11,4,2,110 from dual union all
 13    select 12,4,3,120 from dual
 14  ),
 15  type as (
 16    select 1 id, 'A' name from dual union all
 17    select 2,'B' from dual union all
 18    select 3,'C' from dual union all
 19    select 4,'D' from dual)
 20  select d.month,
 21         max(case when t.name = 'A' then d.value else null end) valueA,
 22         max(case when t.name = 'B' then d.value else null end) valueB,
 23         max(case when t.name = 'C' then d.value else null end) valueC,
 24         max(case when t.name = 'D' then d.value else null end) valueD
 25    from data d,
 26         type t
 27   where d.type = t.id
 28*  group by d.month
SQL> /

     MONTH     VALUEA     VALUEB     VALUEC     VALUED
---------- ---------- ---------- ---------- ----------
         1         10         40         70        100
         2         20         50         80        110
         3         30         60         90        120
就这样

SELECT month
      ,SUM(valueA) AS valueA
      ,SUM(valueB) AS valueB
      ,SUM(valueC) AS valueC
      ,SUM(valueD) AS valueD
FROM (
SELECT month , DECODE(type,1,value,0) valueA
             , DECODE(type,2,value,0) valueB
             , DECODE(type,3,value,0) valueC
             , DECODE(type,4,value,0) valueD
FROM DATA)
GROUP BY month
order by month
就这样

SELECT month
      ,SUM(valueA) AS valueA
      ,SUM(valueB) AS valueB
      ,SUM(valueC) AS valueC
      ,SUM(valueD) AS valueD
FROM (
SELECT month , DECODE(type,1,value,0) valueA
             , DECODE(type,2,value,0) valueB
             , DECODE(type,3,value,0) valueC
             , DECODE(type,4,value,0) valueD
FROM DATA)
GROUP BY month
order by month

你为什么不在这里输入问题,而不是制作文本编辑器的屏幕截图?文本截图几乎没有用处。对不起,但当我尝试使用文本发布时,它丢失了空格,并且看起来[code][/code]在这里不起作用。告诉我怎么做,我会编辑。@LZZ:编辑问题时,右上角有一个小问号,它可以为您提供所需的所有格式帮助。@LZZ:另外,格式帮助实际上是打在您脸上的。忽视它需要大量的精神保护。下次:多读一些。假设您也可以在站点上的其他人正在发布格式化文本时发布格式化文本。;-)你为什么不在这里输入问题,而不是制作文本编辑器的屏幕截图?文本截图几乎没有用处。对不起,但当我尝试使用文本发布时,它丢失了空格,并且看起来[code][/code]在这里不起作用。告诉我怎么做,我会编辑。@LZZ:编辑问题时,右上角有一个小问号,它可以为您提供所需的所有格式帮助。@LZZ:另外,格式帮助实际上是打在您脸上的。忽视它需要大量的精神保护。下次:多读一些。假设您也可以在站点上的其他人正在发布格式化文本时发布格式化文本。;-)+谢谢你,我甚至没想到会有这样一个完整的答案,我会很高兴有一个“这叫做Pivot”。非常感谢你,也很抱歉我输入了所有这些数字。这是一项艰巨的工作。在其他环境中,它也被称为交叉表。+1为了努力,我看了很累。谢谢你,我甚至没想到会有这样一个完整的答案,我会很高兴有一个“这就是所谓的枢轴”。非常感谢你,很抱歉为键入所有这些数字所做的工作。这是一个很大的工作。在其他环境中也称为交叉表。