[sql server] 问题总结7- union-- union all--with as 实例

有三个表,Porducts(产品表),InStorages(入库表)和TheStorages(出库表)

Porducts表中数据为
id PorductsCode
1 111
2 222
3 333

InStorages表中数据为
id          PorductsCode          InStoragesNumber           InStoragesTime
1                111                            100                                2011-1-1
2                111                             20                                 2011-1-2  
3                 222                            45                                 2011-1-1
4                 222                            55                                 2011-1-3
   
TheStorages表中数据为


id         PorductsCode         TheStoragesNumber        TheStoragesTime
1            111                            60                                   2011-1-2
2            111                           220                                  2011-1-3  
3            333                            85                                   2011-1-1
4            222                            15                                   2011-1-3

入库表和出库表中分别有入库记录和出库记录,我需要将这三张表联合查询出来,
结果显示为:
id                   PorductsCode 入库数量        出库数量        时间
-------------------- ------------ ----------- ----------- ----------
1                    111          100         0           2011-01-01
2                    111          20          60          2011-01-02
3                    111          0           220         2011-01-03
4                    222          45          0           2011-01-01
5                    222          55          15          2011-01-03
6                    333          0           85          2011-01-01


查询为空的字段都用0表示

 

--------------------------

 

 

 

 

if exists (select * from sysobjects where id = OBJECT_ID('[InStorages]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [InStorages]

CREATE TABLE [InStorages] (
[id] [int]  NULL,
[PorductsCode] [varchar]  (50) NULL,
[InStoragesNumber] [int]  NULL,
[InStoragesTime] [datetime]  NULL)

INSERT [InStorages] ([id],[PorductsCode],[InStoragesNumber],[InStoragesTime]) VALUES ( 1,'111',100,'2011-1-1 0:00:00')
INSERT [InStorages] ([id],[PorductsCode],[InStoragesNumber],[InStoragesTime]) VALUES ( 2,'111',20,'2011-1-2 0:00:00')
INSERT [InStorages] ([id],[PorductsCode],[InStoragesNumber],[InStoragesTime]) VALUES ( 3,'222',45,'2011-1-1 0:00:00')
INSERT [InStorages] ([id],[PorductsCode],[InStoragesNumber],[InStoragesTime]) VALUES ( 4,'222',55,'2011-1-3 0:00:00')

 

 

 

 

if exists (select * from sysobjects where id = OBJECT_ID('[TheStorages]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [TheStorages]

CREATE TABLE [TheStorages] (
[id] [int]  NULL,
[PorductsCode] [varchar]  (50) NULL,
[TheStoragesNumber] [int]  NULL,
[TheStoragesTime] [datetime]  NULL)

INSERT [TheStorages] ([id],[PorductsCode],[TheStoragesNumber],[TheStoragesTime]) VALUES ( 1,'111',60,'2011-1-2 0:00:00')
INSERT [TheStorages] ([id],[PorductsCode],[TheStoragesNumber],[TheStoragesTime]) VALUES ( 2,'111',220,'2011-1-3 0:00:00')
INSERT [TheStorages] ([id],[PorductsCode],[TheStoragesNumber],[TheStoragesTime]) VALUES ( 3,'333',85,'2011-1-1 0:00:00')
INSERT [TheStorages] ([id],[PorductsCode],[TheStoragesNumber],[TheStoragesTime]) VALUES ( 4,'222',15,'2011-1-3 0:00:00')

 

 

 

 

 

 WITH TT
AS
(
SELECT PorductsCode,InStoragesTime AS Time
FROM InStorages
UNION
SELECT PorductsCode,TheStoragesTime AS Time
FROM TheStorages)

/**用UNION  创建一个框架 ,其中包括 PorductsCode和时间两个字段,因为 UNION  会把这两列的数据分别合并到一起,所以进货和出货数量列不适合在UNION  里设置。下面的 left jion 就是 添加这2个字段的**/

SELECT ROW_NUMBER() OVER(ORDER BY GETDATE()) AS id,TT.PorductsCode,ISNULL(B.instoragesnumber,0) AS '入库数量',ISNULL(C.TheStoragesNumber,0) AS '出库数量' ,CONVERT(VARCHAR(10),TT.time,120) AS '时间'
FROM TT
LEFT JOIN InStorages B ON  B.InStoragesTime  = TT.time AND b.PorductsCode = TT.PorductsCode
left JOIN TheStorages C ON C.TheStoragesTime = TT.time AND c.PorductsCode = TT.PorductsCode

/*
id                   PorductsCode 入库数量        出库数量        时间
-------------------- ------------ ----------- ----------- ----------
1                    111          100         0           2011-01-01
2                    111          20          60          2011-01-02
3                    111          0           220         2011-01-03
4                    222          45          0           2011-01-01
5                    222          55          15          2011-01-03
6                    333          0           85          2011-01-01

(6 行受影响)
*/


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值