`
aogu_xt
  • 浏览: 9380 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

请您先登录,才能继续操作

求小计,总计的一个SQL方法。

SQL 
阅读更多
--创建表。
CREATE TABLE TBL_REVENUE (
  FNAME    VARCHAR(20)   NOT NULL,  --名字
  FMONTH   INT   NOT NULL, --月份
  FTYPE    INT   NOT NULL, --类型(0为收入,1为支出)
  FMONEY   DECIMAL(10,2)   NOT NULL, --金额
  FPURPOSE VARCHAR(100)   NULL); --用途

--插入数据。
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 0, 7300, '工资' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 1, 200, '交手机费' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 1, 168, '请哥们吃饭' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 1, 600, '给老婆买化妆品' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 1, 600, '吃饭' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 1, 1, 1550, '房租' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 2, 0, 7300, '工资' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 2, 1, 1200, '买手机' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 2, 1, 1550, '房租' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 2, 0, 1300, '发奖金' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老公', 2, 1, 600, '吃饭' );

INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 1, 0, 4000, '工资' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 1, 1, 300, '交手机费' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 1, 1, 1000, '吃饭' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 1, 1, 2000, '买衣服' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 2, 0, 4100, '工资' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 2, 1, 200, '交手机费' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 2, 1, 700, '吃饭' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('老婆', 2, 1, 158, '买被' );

INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('孩子', 1, 1, 300, '零花钱' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('孩子', 1, 1, 115, '买文具' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('孩子', 1, 1, 86, '交书费' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('孩子', 2, 1, 300, '零花钱' );
INSERT INTO TBL_REVENUE (FNAME, FMONTH, FTYPE, FMONEY, FPURPOSE) VALUES ('孩子', 2, 1, 600, '买衣服和鞋' );

--每个人,每个月的收入和支出算出来。
WITH TBL_BASE
     AS (SELECT   FNAME,
                  FMONTH,
                  SUM(CASE 
                        WHEN FTYPE = 0 THEN FMONEY
                        ELSE 0
                      END) IN_MONEY,
                  SUM(CASE 
                        WHEN FTYPE = 1 THEN FMONEY
                        ELSE 0
                      END) OUT_MONEY
         FROM     TBL_REVENUE
         GROUP BY FNAME,FMONTH),

--每个人,每个月的收入和支出算出来,加入是不是小计,总计FLG的值。
     TBL_LIST
     AS (SELECT FNAME,
                FMONTH,
                IN_MONEY,
                OUT_MONEY,
                IN_MONEY
                  - OUT_MONEY LEFT_MONEY,
                FNAME SORT_NM,
                0 SUB_FLG,
                0 TOTAL_FLG
         FROM   TBL_BASE),

--以人为单位的收支计算出来,记为“小计”。
     TBL_SUB_TOTAL
     AS (SELECT   '小计' FNAME,
                  NULL FMONTH,
                  SUM(IN_MONEY) IN_MONEY,
                  SUM(OUT_MONEY) OUT_MONEY,
                  SUM(LEFT_MONEY) LEFT_MONEY,
                  FNAME SORT_NM,
                  1 SUB_FLG,
                  0 TOTAL_FLG
         FROM     TBL_LIST
         GROUP BY FNAME),

--所有人的收支情况,记为“总计”。
     TBL_TOTAL
     AS (SELECT '总计' FNAME,
                NULL FMONTH,
                SUM(IN_MONEY) IN_MONEY,
                SUM(OUT_MONEY) OUT_MONEY,
                SUM(LEFT_MONEY) LEFT_MONEY,
                '' SORT_NM,
                1 SUB_FLG,
                2 TOTAL_FLG
         FROM   TBL_SUB_TOTAL)

--把每个人以月为单位的统计,以及每个人的小计,家庭的总计统计出来。
SELECT   FNAME,
         FMONTH,
         IN_MONEY,
         OUT_MONEY,
         LEFT_MONEY
FROM     (SELECT FNAME,
                 FMONTH,
                 IN_MONEY,
                 OUT_MONEY,
                 LEFT_MONEY,
                 SORT_NM,
                 SUB_FLG,
                 TOTAL_FLG
          FROM   TBL_LIST
          UNION ALL
          SELECT FNAME,
                 FMONTH,
                 IN_MONEY,
                 OUT_MONEY,
                 LEFT_MONEY,
                 SORT_NM,
                 SUB_FLG,
                 TOTAL_FLG
          FROM   TBL_SUB_TOTAL
          UNION ALL
          SELECT FNAME,
                 FMONTH,
                 IN_MONEY,
                 OUT_MONEY,
                 LEFT_MONEY,
                 SORT_NM,
                 SUB_FLG,
                 TOTAL_FLG
          FROM   TBL_TOTAL) TMPTBL
ORDER BY TOTAL_FLG,
         SORT_NM,
         SUB_FLG,
         FMONTH;

--删掉表。
DROP TABLE TBL_REVENUE;
 

 

1
0
分享到:
评论

相关推荐

    用SQL实现统计报表中的小计与合计的方法详解

    接着,为了实现小计和合计,我们创建另一个临时表#TB1。在这个过程中,我们会用到标识符(identity)列来区分原始数据和计算的数据。通过`SELECT * INTO #TB1 FROM #TB WHERE 1<>1`,我们创建了一个空的#TB1表,保留...

    SQL 数据分析:销售数据的小计/合计/总计以及数据透视表

    文章目录小计、合计与总计多...本文就来介绍一下如何使用 SQL 实现销售数据的小计、合计、总计以及多维度交叉统计和数据透视表。我们首先列出这些功能在主流数据库中的支持情况: 功能 Oracle MySQL SQL Server Po

    使用ROLLUP函数生成报表的小计、合计

    使用了`ROLLUP`之后,查询结果不仅包含了每个在职状态的人数,还会自动添加一个总计行,该行的数据汇总了所有在职状态的人数。 #### 三、高级技巧:使用GROUPING_ID函数标识汇总行 为了更直观地区分汇总行和普通行...

    sql rollup用法 小计汇总

    下面我们将详细探讨SQL ROLLUP的用法以及其在生成小计和总计时的作用。 1. 单一维度汇总 在只有一个汇总级别时,ROLLUP会生成每个组的总和,最后还会计算所有组的总计。以下是一个示例: ```sql SELECT province ...

    Sql Server 分组统计并合计总数及WITH ROLLUP应用

    总结一下,`Sql Server`中的`WITH ROLLUP`操作符是进行分组统计并生成包含小计和总计报表的有效方法。它与`GROUP BY`结合使用,可以方便地生成层次化的总计,帮助用户快速理解数据的分布和总量。通过理解并熟练运用`...

    sql server 2000数据库常有查询语句

    - 第二种方法利用`MINUS`操作符从一个结果集中去掉另一个结果集中的所有行,从而达到选择特定行范围的目的。 ### 3. 实现分组(小计,合计) 这个查询示例展示了如何在查询结果中添加小计和总计行。 ```sql ...

    使用SQL实现小计,合计以及排序

    在SQL(Structured Query Language)中,实现小计、合计及排序是数据分析和报表制作中常见的需求。本示例中,我们将探讨如何通过SQL语句来完成这个任务。 首先,我们创建了一个临时表#TB,用于存储测试数据。该表...

    SQL 函数集.rar

    本压缩包"SQL 函数集.rar"显然是一个关于SQL函数的资源集合,特别强调了交叉表、小计、合计以及日期函数的应用。下面将详细阐述这些知识点。 1. **交叉表(Cross Tabulation)**: 交叉表也称为透视表,通常用于...

    Teradata_SQL基础教程.pdf

    使用WITH BY子句进行数据的总计与小计操作,常见于报表生成。 以上总结知识点涵盖了Teradata SQL基础教程的多个核心内容,从关系数据库基础概念到Teradata特有的SQL命令使用,再到数据操作和函数应用,是一套较为...

    关于如何更改购物栏中的产品数量后,点击“更新数据量”按钮后,在datagrid中计算出每个产品的小计和总合计?

    在`binddata()`方法中,开发者首先定义了一个SQL语句用于从数据库中选取所有购物车条目,并按ID降序排列。然后,使用自定义的数据类`dbbind`执行这个SQL语句,将结果存储到`DataSet C2`中。接下来,创建一个新的`...

    sql小计汇总 rollup用法实例分析

    SQL中的ROLLUP操作是用于生成多级汇总数据的一种方法,尤其在处理复杂的数据分组时非常有用。在Oracle和SQL Server等数据库系统中都支持此功能。本文将深入讲解ROLLUP在SQL Server 2005中的应用,并通过实例来展示其...

    1个T-SQL试题

    另一个可能不必要的字段是`Invoice_No`,因为如果每个发票都有唯一的发票日期和客户ID组合,那么发票号就不再是必须的唯一标识符了。 **2. 列出所有按名称排序的客户** 使用SELECT语句结合ORDER BY子句即可实现: `...

    数据库系统 SQL 23PDF 完整 36.4M

    本资源包包含了23个PDF文档,总计36.4M,内容全面覆盖了数据库系统的理论基础以及SQL(Structured Query Language)的实用技巧。 数据库系统是一个组织和存储数据的软件系统,它允许用户高效地查询、更新和管理数据...

    SQL实例集锦(很实用)

    `GROUP BY ALL`在某些数据库系统中是一个特殊选项,它会保留所有原始行,而不是像普通`GROUP BY`那样只保留每组的一行。然而,这个概念在不同的数据库管理系统中有不同的实现方式,有的系统可能不支持`GROUP BY ALL`...

    Oracle的Rollup用法

    ROLLUP 子句可以将查询结果按照一个或多个字段进行分组,并且可以生成子总计和总计。 在 Oracle 中,ROLLUP 子句可以与 GROUP BY 子句配合使用,以便对数据进行分组和聚合。ROLLUP 子句可以指定一个或多个字段,...

    探讨SQL compute by的使用分析

    总之,`COMPUTE BY`子句是SQL Server中处理分组和汇总的一个强大工具,它可以提供更丰富的数据展示方式,使得数据分析和报告更加灵活和详细。在实际应用中,根据具体需求选择合适的分组和汇总方法,能够更有效地提取...

    Teradata基础教程

    由于内容过于冗长,以下内容将对部分指定章节进行详细解释: ### 关系数据库基础 关系数据库是基于关系模型的数据库,采用一系列...本部分探讨了如何使用SQL语句实现总计和小计,以及对分组聚合结果的进一步处理。

    微软rdlc报表创建、设置数据、设置分组、分组统计

    RDLC(Report Definition Language Client Report)是微软提供的一个客户端报告设计语言,用于在.NET环境中创建和展示数据报表。它是一种XML格式,允许开发者在Windows Forms和ASP.NET应用程序中生成交互式报表。...

    用JSP和数据库做的购物车的源程序

    8. **购物车展示**:显示购物车中的商品信息,包括商品名称、市场价、优惠价、数量、小计、定金比例、定金小计,并提供删除商品的链接。 9. **总计计算**:计算购物车中所有商品的总金额、定金总计和结余(总金额...

    spark dataframe 将一列展开,把该列所有值都变成新列的方法

    在处理大数据时,Apache Spark 是一个非常强大的工具。特别是在数据处理与分析领域,Spark 的 DataFrame API 提供了丰富的功能来帮助用户高效地操作数据。本文将详细介绍如何在 Spark DataFrame 中将某一列中的值...

Global site tag (gtag.js) - Google Analytics