首页 > 代码库 > SQL 报表 --简易进销系统

SQL 报表 --简易进销系统

模型图:

技术分享

 


--
============================================ -- Author: lifu -- Create Date: 2017-06-18 -- Descrpition: 简化进销系统 报表制作 -- ============================================ -- Tables And Data Start ====================== CREATE DATABASE SimpleEntrySystem GO USE SimpleEntrySystem GO --创建T_Person表 人员表 CREATE TABLE T_Person ( FId VARCHAR(20) NOT NULL , FNumber VARCHAR(20) , --人员工号 FName VARCHAR(20) , --人员姓名 FManagerId VARCHAR(20) , --上级主管主键(指向T_Person表的 FId字段的外键) PRIMARY KEY ( FId ) , FOREIGN KEY ( FManagerId ) REFERENCES T_Person ( Fid ) ) --创建T_Merchandise表 商品表 CREATE TABLE T_Merchandise ( FId VARCHAR(20) NOT NULL , FNumber VARCHAR(20) , --商品编号 FName VARCHAR(20) , --商品名 FPrice INT , --商品价格 PRIMARY KEY ( fid ) ) --创建T_SaleBill表 销售单主表 CREATE TABLE T_SaleBill ( FId VARCHAR(20) NOT NULL , FNumber VARCHAR(20) , --销售单编号 FBillMakerId VARCHAR(20) ,--开单人主键(指向T_Person表的 FId字段的外键) FMakeDate DATETIME , --制单日期 FConfirmDate DATETIME , --确认日期 PRIMARY KEY ( fid ) , FOREIGN KEY ( Fbillmakerid ) REFERENCES T_Person ( fid ) ) --创建T_SaleBillDetail表 销售单明细记录 CREATE TABLE T_SaleBillDetail ( FId VARCHAR(20) , FBillId VARCHAR(20) , --主表主键(指向 T_SaleBill 表的 FId 字段的外键) FMerchandiseId VARCHAR(20) , --商品主键(指向T_Merchandise表的FId字段的外键) FCount INT , --销售数量 PRIMARY KEY ( fid ) , FOREIGN KEY ( Fbillid ) REFERENCES T_SaleBill ( fid ) , FOREIGN KEY ( Fmerchandiseid ) REFERENCES T_Merchandise ( fid ) ) --创建T_PurchaseBill表 采购单主表 CREATE TABLE T_PurchaseBill ( Fid VARCHAR(20) NOT NULL , FNumber VARCHAR(20) , --采购单编号 FBillMakerId VARCHAR(20) ,--开单人主键(指向T_Person表的FId字段的外键) FMakeDate DATETIME , --制单日期 FConfirmDate DATETIME , --确认日期 PRIMARY KEY ( fid ) , FOREIGN KEY ( FBillMakerId ) REFERENCES T_Person ( fid ) ) --创建T_PurchaseBillDetail表 采购单明细记录 CREATE TABLE T_PurchaseBillDetail ( FId VARCHAR(20) NOT NULL , FBillId VARCHAR(20) , --主表主键(指向T_PurchaseBill表的FId字段的外键) FMerchandiseId VARCHAR(20) ,--商品主键(指向T_Merchandise表的FId字段的外键) FCount INT , --采购数量 PRIMARY KEY ( FId ) , FOREIGN KEY ( FBillId ) REFERENCES T_PurchaseBill ( FId ) , FOREIGN KEY ( FMerchandiseId ) REFERENCES T_Merchandise ( FId ) ) --首先向T_Person、T_Merchandise两张表中插入演示数据: INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00001, 1, Robert, NULL ) INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00002, 2, John, 00001 ) INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00003, 3, Tom, 00001 ) INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00004, 4, Jim, 00003 ) INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00005, 5, Lily, 00002 ) INSERT INTO T_Person ( FId, FNumber, FName, FManagerId ) VALUES ( 00006, 6, Merry, 00003 ) INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice ) VALUES ( 00001, 1, Bacon, 30 ) INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice ) VALUES ( 00002, 2, Cake, 2 ) INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice ) VALUES ( 00003, 3, Apple, 6 ) -- 还要向T_SaleBill和T_PurchaseBill表中插入演示数据: INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00001, 1, 00006, 2007-03-15, 2007-05-15 ) INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00002, 2, NULL, 2006-01-25, 2006-02-03 ) INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00003, 3, 00001, 2006-02-12, 2007-01-11 ) INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00004, 4, 00003, 2008-05-25, 2008-06-15 ) INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00005, 5, 00005, 2008-03-17, 2007-04-15 ) INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00006, 6, 00002, 2002-02-03, 2007-11-11 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00001, 1, 00006, 2007-02-15, 2007-02-15 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00002, 2, 00004, 2003-02-25, 2006-03-03 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00003, 3, 00001, 2007-02-12, 2007-07-12 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00004, 4, 00002, 2007-05-25, 2007-06-15 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00005, 5, 00002, 2007-03-17, 2007-04-15 ) INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate ) VALUES ( 00006, 6, NULL, 2006-02-03, 2006-11-20 ) -- 向T_SaleBillDetail表和T_PurchaseBillDetail表中插入演示数据: INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00001, 00001, 00003, 20 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00002, 00001, 00001, 30 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00003, 00001, 00002, 22 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00004, 00002, 00003, 12 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00005, 00002, 00002, 11 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00006, 00003, 00001, 60 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00007, 00003, 00002, 2 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00008, 00003, 00003, 5 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00009, 00004, 00001, 16 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00010, 00004, 00002, 8 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00011, 00004, 00003, 9 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00012, 00005, 00001, 6 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00013, 00005, 00003, 26 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00014, 00006, 00001, 66 ) INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00015, 00006, 00002, 518 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00001, 00001, 00002, 12 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00002, 00001, 00001, 20 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00003, 00002, 00001, 32 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00004, 00002, 00003, 18 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00005, 00002, 00002, 88 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00006, 00003, 00003, 19 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00007, 00003, 00002, 6 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00008, 00003, 00001, 2 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00009, 00004, 00001, 20 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00010, 00004, 00003, 18 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00011, 00005, 00002, 19 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00012, 00005, 00001, 26 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00013, 00006, 00003, 3 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00014, 00006, 00001, 22 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount ) VALUES ( 00015, 00006, 00002, 168 ) -- Tables And Data End ======================= -- 报表=================================================================== USE [SimpleEntrySystem] GO -- 显示制单人详细信息 SELECT [FNumber], [FBillMakerId], [FMakeDate] FROM [dbo].[T_SaleBill] --inner join 需要知道是哪个人开的单 SELECT [s].[FNumber], [p].[FName], [s].[FMakeDate] FROM [dbo].[T_SaleBill] AS [s] INNER JOIN [dbo].[T_Person] AS [p] ON [s].[FBillMakerId] = [p].[FId] --left outer join 需要将空的开单人标识 SELECT [s].[FNumber], COALESCE([p].[FName], 没有开单人), [s].[FMakeDate] FROM [dbo].[T_SaleBill] AS [s] LEFT OUTER JOIN [dbo].[T_Person] AS [p] ON [s].[FBillMakerId] = [p].[FId] -- 显示销售单的信息 /* 要求列出所有销售单的详细信息,每行显示销售单的每一条销售记录,同时每行头部要 显示此行所属的销售单的信息,比如单号、开单人、开单日期等。T_SaleBillDetail表保存的 是销售单的每一条销售记录,T_SaleBill表保存的是销售单的头信息,T_SaleBillDetail表的 FMerchandiseId字段保存的是销售的商品主键,而 T_SaleBill表的 FBillMakerId字段保存的 是开单人的主键,只要对这四张表做连接查询即可。由于 T_SaleBill表的 FBillMakerId字段 有可能为空,所以在 T_SaleBill 表和 T_Person 表进行连接的时候要使用左外连接,而为了 提高查询效率其他连接都使用内连接 */ SELECT [saleBill].[FNumber] AS 销售单编号, COALESCE([person].[FName], 没有开单人) AS 开单人, [saleBill].[FMakeDate] AS 销售时间, [merchandise].[FName] AS 商品名称, [saleBillDetail].[FCount] AS 销售数量 FROM [dbo].[T_SaleBill] AS [saleBill] LEFT OUTER JOIN [dbo].[T_Person] AS [person] ON [saleBill].[FBillMakerId] = [person].[FId] INNER JOIN [dbo].[T_SaleBillDetail] AS [saleBillDetail] ON saleBillDetail.[FBillId] = [saleBill].[FId] INNER JOIN [dbo].[T_Merchandise] AS [merchandise] ON [merchandise].[FId] = [saleBillDetail].[FMerchandiseId] ORDER BY [saleBill].[FMakeDate] DESC --收益计算 /* 要求计算每种商品的总收益, 受收益的定义为所有的销售单中该商品的销售总额减去所 有的采购单中该商品的购买总额。 */ ---------------------------------------------------------------------------------- --销售额 SELECT [m].[FName] AS 商品名称, [m].[FPrice] * [sbd].[FCount] AS 销售额 FROM [dbo].[T_Merchandise] AS [m] INNER JOIN [dbo].[T_SaleBillDetail] AS [sbd] ON [m].[FId] = [sbd].[FMerchandiseId] UNION ALL --采购额 SELECT [m].[FName] AS 商品名称, [m].[FPrice] * [pbd].[FCount] * ( -1 ) AS 采购额 FROM [dbo].[T_Merchandise] AS [m] INNER JOIN [dbo].[T_PurchaseBillDetail] AS [pbd] ON [m].[FId] = [pbd].[FMerchandiseId] ---------------------------------------------------------------------------------- --将采购和销售计算合并 SELECT [detail].[FName], SUM([detail].[总额]) FROM ( SELECT [m].[FName] , [m].[FPrice] * [sbd].[FCount] AS 总额 FROM [dbo].[T_Merchandise] AS [m] INNER JOIN [dbo].[T_SaleBillDetail] AS [sbd] ON [m].[FId] = [sbd].[FMerchandiseId] UNION ALL SELECT [m].[FName] , [m].[FPrice] * [pbd].[FCount] * ( -1 ) AS 总额 FROM [dbo].[T_Merchandise] AS [m] INNER JOIN [dbo].[T_PurchaseBillDetail] AS [pbd] ON [m].[FId] = [pbd].[FMerchandiseId] ) AS detail GROUP BY [detail].[FName]

SQL 报表 --简易进销系统