两表数据简单合并的sql语句,怎么写?

披着虎皮的石头 2012-04-12 05:56:54

有table1
Fld1 Fld2
D1 100

有table2
Fld1 Fld2
D1 1
D1 2
D1 3

写一个SQ语句L,得到如下数据:
D1 1 100
D1 2 0
D1 3 0
...全文
284 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
boluoyibanban 2012-04-13
  • 打赏
  • 举报
回复
这两个表有什么关系么?
boluoyibanban 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

有table1
Fld1 Fld2
D1 100
D2 200

有table2
Fld1 Fld2
D1 1
D1 2
D1 3

D2 1
D2 2
D2 3

写一个SQ语句L,得到如下数据:
D1 1 100
D1 2 0
D1 3 0

D2 1 200
D2 2 0
D2 3 0
[/Quote]
select table2.fld1,table2.fld2,
decode(table2.fld2,1,table1.fld2,0)
from table1,table2
where table1.fld1=table2.fld1;
  • 打赏
  • 举报
回复
这效果可以了么?




PS:新手注意结贴
  • 打赏
  • 举报
回复

create table table_order_mst (订单编号 varchar2(20),订单类型 varchar2(20),订单总金额 number(10),成本价 number(10),数量 number(10));
insert into table_order_mst values ('D1','折扣订单',10000,0,0);
insert into table_order_mst values ('D2','成本订单',20000,1000,10);

create table table_order_det (订单编号 varchar2(5),数量 number(10),单价 number(10),金额 number(10));
insert into table_order_det values ('D1',4,1000,4000);
insert into table_order_det values ('D1',4,1000,6000);
insert into table_order_det values ('D2',6,0,0);
insert into table_order_det values ('D2',7,0,0);

select tb2.订单编号,tb2.数量,tb2.单价,
case when row_number() over(partition by tb2.订单编号 order by tb2.订单编号)=1 and tb2.金额=0 then tb1.订单总金额 else tb2.金额 end 金额
from table_order_mst tb1,table_order_det tb2
where tb1.订单编号=tb2.订单编号;

订单编号 数量 单价 金额
---------------------------------------------
1 D1 4 1000 4000
2 D1 6 1000 6000
3 D2 6 0 20000
4 D2 7 0 0

  • 打赏
  • 举报
回复
或许剑走偏锋,走火入魔。
换种简单写法,把折扣类订单写一个视图,成本类订单写一个视图,最后再写一个总金额视图,
然后把三个视图union all一下,再排序就好了。
  • 打赏
  • 举报
回复
各位大佬,都理解简单了,tab1的fld2的值,不一定是1
  • 打赏
  • 举报
回复


订单主表 table_order_mst

订单编号 订单类型 订单总金额 成本价 数量
D1 折扣订单 10000 0 0
D2 成本订单 20000 1000 10

订单主表 table_order_det

订单编号 数量 单价 金额
D1 4 1000 4000
D1 6 1000 6000

D2 6 0 0
D2 7 0 0

最后得到:
订单编号 订单类型 订单数量 订单单价 订单金额
D1 折扣订单 4 1000 4000
D1 折扣订单 6 1000 6000

D2 成本订单 6 0 20000
D2 成本订单 7 0 0

订单金额合计是 30000.
  • 打赏
  • 举报
回复
尼玛 刚居然断网了 重启路由器 等了几分钟
  • 打赏
  • 举报
回复

select tb2.fld1,tb2.fld2,case when row_number() over(partition by tb2.fld1 order by tb2.fld2)=1 then tb1.fld2 else 0 end fld2
from tb1,tb2
where tb1.fld1=tb2.fld1;


fld1 fld2 fld2
-------------------------
1 D1 1.32 100
2 D1 1.33 0
3 D1 1.45 0
4 D2 1.22 200
5 D2 1.33 0
6 D2 1.55 0

ssqtjffcu 2012-04-12
  • 打赏
  • 举报
回复
create table table1 (
FLD1 VARCHAR2(111),
FLD2 NUMBER(20,2)
)
create table table2(
FLD1 VARCHAR2(111),
FLD2 NUMBER(20,2)
)
insert into table1 (FLD1, FLD2) values ('D1', 100);
insert into table2 (FLD1, FLD2) values ('D1', 1);
insert into table2 (FLD1, FLD2) values ('D1', 2);
insert into table2 (FLD1, FLD2) values ('D1', 3);
insert into table1 (FLD1, FLD2) values ('D2', 200);
insert into table2 (FLD1, FLD2) values ('D2', 1);
insert into table2 (FLD1, FLD2) values ('D2', 2);
insert into table2 (FLD1, FLD2) values ('D2', 3);

select t1.fld1,
t2.fld2,
decode(row_number() over(partition by t1.fld1 order by t2.fld2),
1,
t1.fld2,
0)
from table1 t1, table2 t2
where t1.fld1 = t2.fld1;

FLD1 FLD2 DECODE(ROW_NUMBER()OVER(PARTIT
-------------------------------------------------------------------------------- ---------------------- ------------------------------
D1 1.00 100
D1 2.00 0
D1 3.00 0
D2 1.00 200
D2 2.00 0
D2 3.00 0

6 rows selected
  • 打赏
  • 举报
回复
你等我一下,我写一个比较好理解的表和字段。
  • 打赏
  • 举报
回复
select tb2.fld1,case when tb2.fld2=1 then tb1.fld2 else 0 end fld2
from tb1,tb2
where tb1.fld1=tb2.fld1

把tb2.fld2值,固定为=1,不对。等于1只是一样演示例子。
  • 打赏
  • 举报
回复
那手动排序 是不是fld2最小的赋值为tb1.fld2呢?
  • 打赏
  • 举报
回复
这个问题,是因为遇到计算一个比较复杂的订单金额合计,
有时根据订单明细计算总金额,有时不根据订单明细,而是根据订单主表的总的单价和金额计算。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

如果都确定是1的话 可以这么写
SQL code

create table tb1 (Fld1 varchar2(5),Fld2 number(10));
insert into tb1 values ('D1',100);
insert into tb1 values ('D2',200);

create table tb2 (Fld1 varchar2(5),Fld2 number(……
[/Quote]
table2 也不确定,
也可以是
D1 1.33
D1 1.32
D1 1.45

D2 1.5
  • 打赏
  • 举报
回复
如果都确定是1的话 可以这么写

create table tb1 (Fld1 varchar2(5),Fld2 number(10));
insert into tb1 values ('D1',100);
insert into tb1 values ('D2',200);

create table tb2 (Fld1 varchar2(5),Fld2 number(10));
insert into tb2 values ('D1',1);
insert into tb2 values ('D1',2);
insert into tb2 values ('D1',3);
insert into tb2 values ('D2',1);
insert into tb2 values ('D2',2);
insert into tb2 values ('D2',3);

select tb2.fld1,case when tb2.fld2=1 then tb1.fld2 else 0 end fld2
from tb1,tb2
where tb1.fld1=tb2.fld1


fld1 fld2
-------------------------
1 D1 100
2 D1 0
3 D1 0
4 D2 200
5 D2 0
6 D2 0

  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

有table1
Fld1 Fld2
D1 100
D2 200

有table2
Fld1 Fld2
D1 1
D1 2
D1 3

D2 1
D2 2
D2 3

写一个SQ语句L,得到如下数据:
D1 1 100
D1 2 0
D1 3 0

D2 1 200
D2 2 0
D2 3 0
[/Quote]


tb2没组都有1 然后显示tb1的fld2?
  • 打赏
  • 举报
回复
下面是建表和初始记录
create table table1 (
FLD1 VARCHAR2(111),
FLD2 NUMBER(20,2)
)
create table table2(
FLD1 VARCHAR2(111),
FLD2 NUMBER(20,2)
)
insert into table1 (FLD1, FLD2) values ('D1', 100);

insert into table2 (FLD1, FLD2) values ('D1', 1);
insert into table2 (FLD1, FLD2) values ('D1', 2);
insert into table2 (FLD1, FLD2) values ('D1', 3);
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

select a.Fld1 ,b.Fld2,nvl(a.Fld2,0)from table1 a,table2 b where b.Fld1 = a.Fld1(+)
[/Quote]

不对啊,返回的是:
D1 1 100
D1 2 100
D1 3 100
  • 打赏
  • 举报
回复
有table1
Fld1 Fld2
D1 100
D2 200

有table2
Fld1 Fld2
D1 1
D1 2
D1 3

D2 1
D2 2
D2 3

写一个SQ语句L,得到如下数据:
D1 1 100
D1 2 0
D1 3 0

D2 1 200
D2 2 0
D2 3 0
加载更多回复(3)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧