模型图:

--  ============================================
-- 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 ( '', '', 'Robert', NULL )
INSERT INTO T_Person ( FId, FNumber, FName, FManagerId )
VALUES ( '', '', 'John', '' )
INSERT INTO T_Person ( FId, FNumber, FName, FManagerId )
VALUES ( '', '', 'Tom', '' )
INSERT INTO T_Person ( FId, FNumber, FName, FManagerId )
VALUES ( '', '', 'Jim', '' )
INSERT INTO T_Person ( FId, FNumber, FName, FManagerId )
VALUES ( '', '', 'Lily', '' )
INSERT INTO T_Person ( FId, FNumber, FName, FManagerId )
VALUES ( '', '', 'Merry', '' )
INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice )
VALUES ( '', '', 'Bacon', 30 )
INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice )
VALUES ( '', '', 'Cake', 2 )
INSERT INTO T_Merchandise ( FId, FNumber, FName, FPrice )
VALUES ( '', '', 'Apple', 6 ) -- 还要向T_SaleBill和T_PurchaseBill表中插入演示数据:
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', '', '2007-03-15', '2007-05-15' )
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', NULL, '2006-01-25', '2006-02-03' )
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', '', '2006-02-12', '2007-01-11' )
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', '', '2008-05-25', '2008-06-15' )
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', '', '2008-03-17', '2007-04-15' )
INSERT INTO T_SaleBill ( FId, FNumber, FBillMakerId, FMakeDate, FConfirmDate )
VALUES ( '', '', '', '2002-02-03', '2007-11-11' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', '', '2007-02-15', '2007-02-15' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', '', '2003-02-25', '2006-03-03' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', '', '2007-02-12', '2007-07-12' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', '', '2007-05-25', '2007-06-15' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', '', '2007-03-17', '2007-04-15' )
INSERT INTO T_PurchaseBill ( FId, FNumber, FBillMakerId, FMakeDate,
FConfirmDate )
VALUES ( '', '', NULL, '2006-02-03', '2006-11-20' ) -- 向T_SaleBillDetail表和T_PurchaseBillDetail表中插入演示数据:
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 20 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 30 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 22 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 12 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 11 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 60 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 2 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 5 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 16 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 8 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 9 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 6 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 26 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 66 )
INSERT INTO T_SaleBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 518 ) INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 12 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 20 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 32 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 18 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 88 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 19 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 6 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 2 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 20 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 18 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 19 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 26 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 3 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 22 )
INSERT INTO T_PurchaseBillDetail ( FId, FBillId, FMerchandiseId, FCount )
VALUES ( '', '', '', 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 报表 --简易进销系统的更多相关文章

  1. SpringBoot终章(整合小型进销系统)

    在前面的章节中我们学习Spring的时候可以看到配置文件比较多,所以我们有了SpringBoot 1. 引入依赖 <dependencies> <dependency> < ...

  2. Access-简易进销存管理系统

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  3. openerp 经典收藏 Openerp开发进销存系统完毕总结(转载)

    原文地址:http://blog.csdn.net/heartrude/article/details/9142463 Openerp开发进销存系统完毕总结 分类: 代码历程 OpenERP 工程思想 ...

  4. spring boot的一个小项目小型进销存系统

    项目所需的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  5. C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)

    互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...

  6. 浩瀚技术团队... 安卓智能POS移动PDA开单器 开单器 进销存系统 进销存系统

    浩瀚技术团队... 智能POS移动PDA开单器 开单器 进销存系统 进销存系统 点餐 会员管理 会员管理 深度解读 手机APP移动办公到底是什么? 快速打单POS·不仅仅是快那么简单!  

  7. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  8. Silverlight管理系统源码(用于开发ERP、OA、CRM、HR、进销存、财务等系统之用)

    Silverlight大型管理系统源代码(支持创建ERP.OA.CRM.HR.进销存.财务等系统之用) 可用于开发以下系统 SilverlightERP SilverlightCRM Silverli ...

  9. [系统开发] FileMaker进销存系统

    一.简介 这是我用 FileMaker 编写的进销存系统: FileMaker 是一种在欧美流行的桌面型数据库:它使用非常方便,功能也很强大,用户可以在它上面开发自己的系统: 开发时间:2008年 二 ...

随机推荐

  1. R序列seq

    > seq(from=10,to=20,by=3) [1] 10 13 16 19 > seq(from=10,to=20,length=5) [1] 10.0 12.5 15.0 17. ...

  2. 【紫书】BigInteger 高精度类型 原书上有一个bug:A+B!=B+A

    存个代码 struct BigInterger { static const int BASE = 1e8; ; vector<int> s; BigInterger() { *this ...

  3. win7 链接打印机时提示未知的用户名或错误密码

    使用win7系统时,访问局域网内的计算机 \\ip 要求输入正确用户名和密码,输入用户名和密码后,还是一直提示“未知的用户名或错误密码”. 解决方法: 开始---->运行 打开组策略编辑器 gp ...

  4. table 的td 自适应事项

    media的html结构,如果用display:table-cell实现, table { width: 100%; border-collapse: collapse; border: $bor; ...

  5. [.NET]解决EMF图像自动放大空白

    在.NET中产生emf主要使用Metafile对象,但在使用过程中会发生图像自动放大,多余空白的问题. 模拟:声明Size(100,100)的区域,并绘制p1(-50,-50)->p2(50,5 ...

  6. Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null

    1.Android Studio报错 Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' ...

  7. PHP开发接口使用RSA进行加密解密方法

    网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的.本人提倡经过接口的数据都要进行加密解密之后进行使用. 这篇文章主要介绍使用PHP开发接口, ...

  8. vertx 从Tcp服务端和客户端开始翻译

    写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...

  9. vertx打成jar包发布工程,访问静态页面

    1:添加pom依赖,配置打包插件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

  10. [py]python多态-动态语言的鸭子类型

    弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...