[sql server] 问题总结7- union-- union all--with as 实例
2011-03-07 00:59
573 查看
有三个表,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 行受影响)
*/
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 行受影响)
*/
相关文章推荐
- SQL Server中Union, Union All与TOP关键字同时使用的问题
- SQL Server 排序函数 ROW_NUMBER、RANK、DENSE_RANK、INTERSECT、UNION、UNION ALL 用法总结
- [sql server] 行转列问题总结 - 2、列转行
- 20110611-未将对象引用设置到对象的实例--可能出现的问题总结[转]
- SQL Server 高频问题总结
- c#:未将对象引用设置到对象的实例--可能出现的问题总结(转)
- 未将对象引用设置到对象的实例--可能出现的问题总结
- SQL SERVER中一些常见性能问题的总结[转]
- Java中流的问题总结(实例)
- 关于SQL Server 2008R2本地服务的数据库引擎里没有实例名问题
- 未将对象引用设置到对象的实例--可能出现的问题总结
- Sql server一些常见性能问题的总结
- [sql server] 问题总结17---一个项目涉及到的50个Sql语句(爱新觉罗.毓华整理版)(很值得学习)
- SQL Server的所有数据删除后,主键恢复成以1开始计数问题总结
- 未将对象引用设置到对象的实例--可能出现的问题总结
- SQL Server 高频问题总结
- 鉴于自己安装 SQL Server 2005:常见问题总结。
- 解决“此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭”问题
- 关于打开现有项目时数据库连接配置遇到的问题 连接字符串中的数据源值指定未安装的SQL Server的实例。要解决此问题,可选择安装匹配的SQL Server实例或修改连接字符串中的数据源值
- SQL SERVER中一些常见性能问题的总结