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为了努力,我看了很累。谢谢你,我甚至没想到会有这样一个完整的答案,我会很高兴有一个“这就是所谓的枢轴”。非常感谢你,很抱歉为键入所有这些数字所做的工作。这是一个很大的工作。在其他环境中也称为交叉表。