最近碰到一需求,是酱紫的: 一个销售商品表, 每年每月每天都卖出N种不同种类的商品, 最后要统计每月每种商品的销售额. 或每年的, 在此我模拟创建了一个简单的表, 主要说明经验和大家一块分享, 若发现有问题, 欢迎随时指教.

如下:(此表过于简单, 主要用于说明交叉表)

按某一年的多月查询结果如下:

多年对比查询结果如下:

具体实现代码如下:

----------创建一个交叉表--------------create table salesRecord (

id int primary key identity(1,1) not null,

[date] datetime not null,

[goods] varchar(10) not null,

[money] decimal(10,2) default 0

)

----------向交叉表中插入记录--------------

insert into salesRecord values('2009-3-2','显示器',2300)

insert into salesRecord values('2009-1-3','键盘',30)

insert into salesRecord values('2009-3-2','机箱',200)

insert into salesRecord values('2009-7-2','鼠标',55)

insert into salesRecord values('2009-12-2','硬盘',455)

insert into salesRecord values('2009-9-2','屏保膜',10)

insert into salesRecord values('2009-4-28','硬盘',455)

insert into salesRecord values('2009-2-9','电源线',15)

insert into salesRecord values('2009-3-5','主板',605)

insert into salesRecord values('2009-8-15','摄像头',120)

insert into salesRecord values('2009-5-18','U盘',105)

insert into salesRecord values('2008-5-28','U盘',105)

insert into salesRecord values('2009-10-11','U盘',80)

-------创建访问交叉表的查询语句生成函数---(商品种类赿多,查出出的表字段就赿多)--------------

/*

* @year 某一年

* @ym 有可能是年 有可能是月, 看后边的@flag决定

* @month 某一月

* @flag 对前边参数的说明标记.

*   如果 YY 则某年到某年查询,前两个参数为开始年,结束年,第三个参数无效(但仍然需要传入任意整型值)

*   如果YMM 某一年从几月到几月查询 ,第一个参数为某年, 后两个参数为开始月和结束月.

* @returns 返回组装后的字符串.

*/create function getQueryStr (@y int,@ym int,@m int,@flag varchar(3))

returns varchar(7000)

as

begin

declare @tempStr varchar(20)

declare @rtnStr varchar(7000)

declare @condStr varchar(500)

--判断如果是YY则是查某一年到某一年,组装查询串及条件

if(@flag='YY')

begin

set @rtnStr=' select year(date)  as ''年份'', '

set @condStr=' year(date)>= '+cast(@y as varchar) +' and year(date)<= '+cast(@ym as varchar)+' group by year(date)'

end

else if(@flag='YYM')

--否则查某一年的某一月到某一月,组装查询串及条件 begin

set @rtnStr=' select cast(month(date) as varchar)+''月'' as ''月份'', '

set @condStr=' year(date)= '+cast(@y as varchar)+' and month(date)>= '+cast(@ym as varchar)+' and  month(date)<= '+cast(@m as varchar)+' group by month(date)'

end

declare getOne cursor

for

select distinct goods from salesRecord

open getOne

fetch next from getOne into @tempStr

while @@fetch_status=0

begin

set @rtnStr = @rtnStr+' sum(case goods when'''+@tempStr+'''then money else 0 end) as'''+@tempStr+''','

fetch next from getOne into @tempStr

end

close getOne

deallocate getOne

set @rtnStr=left(@rtnStr,len(@rtnStr)-1)

set @rtnStr=@rtnStr+' from salesRecord where'+@condStr

return @rtnStr

end

----------按多年查询------------

declare @str varchar(7000)

set @str=dbo.getQueryStr(2008,2009,0,'YY');

exec(@str)

----------按一年多月查询------------

declare @str varchar(7000)

set @str=dbo.getQueryStr(2009,0,12,'YYM');

exec(@str)

----------查询下源表中的数据对比下------------

select * from salesRecord order by date

---------如果不用了可以删除函数和表--------------

drop function getQueryStr

drop table salesRecord

Java实现交叉表_Sql交叉表简单实现 | 学步园相关推荐

  1. 查询列名在哪张表_SQL—多表查询

    文章结构: 表的加法 表的联结 表的联结案例 case表达式 sqlzoo练习题 表的加法[union|并集]:表的加法是指将表的数据按行合并在一起(要求两张表的数据结构一致),是按行进行添加数据. ...

  2. oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园

    ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...

  3. java调用存储过程sqlserver_Java调用SqlServer存储过程怎么实现 | 学步园

    在使用Java开发时,经常会遇到调用SqlServer存储过程的问题.下面学步园小编来讲解下Java调用SqlServer存储过程怎么实现? Java调用SqlServer存储过程怎么实现 1.数据库 ...

  4. php提交后清楚表单缓存,PHP提交表单后如何控制缓存 | 学步园

    在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现. 1.使用header头设置缓存控制头Cache-control. PHP代码 h ...

  5. java tail -f 后返回_tail -f 的实现 | 学步园

    最原始的想法和实现 最容易想到的就是不断的读取一个文件,如果读取到文件结尾(EOF),那么sleep一下然后再次尝试. 事实上Apache Common IO里就有一个这样的实现 这种方法到优点是简单 ...

  6. java communal_java 打印 类似打印存折的打印。 | 学步园

    前段时间由于需要做了个打印,主要是打印学生证. 需求很简单,就是在规定的坐标点打印规定的内容即可. 为了实现,却费尽了周折,不过还好,在大家的帮助下,终于实现了最终想要的功能. 其代码如下: pack ...

  7. java 实现电子签名_java swing实现手写板电子签名系统 | 学步园

    java swing实现手写板电子签名系统 支持 手写板 ,触摸屏电脑,支持压强 压感效果......................... 部分代码  MyLeftPanel.java public ...

  8. java adt 布局_android布局——AbsoluteLayout(布局)详解 | 学步园

    AbsoluteLayout(绝对布局) 前言: 该布局是不会写代码的人专用的,直接在ADT下拉组件到合适位置即可;很坑爹的说! 绝对布局是直接通过X,Y坐标来控制组件在Activity中的位置的 说 ...

  9. java runnable 匿名_匿名类实现Runnable接口 | 学步园

    15.2.3  使用Runnable接口 我们知道,Java中的类只能够是单继承,也就是说,如果一个类为了使用线程而继承了Thread类,它就不能再继承别的类了.这很可能给编程带来不便.本节中介绍的就 ...

最新文章

  1. java学习笔记(2)
  2. 统计学习导论 Chapter2--What Is Statistical Learning?
  3. Pug+Stylus+Bootstrap入门
  4. python flask项目过程_Python 开发过程遇到的问题
  5. 解决win7和ubuntu双系统ubuntu不能上网的问题
  6. 字典、集合与字符串——Python基础语法
  7. JAVA 实现《超级玛丽》游戏
  8. android模拟器设置静态ip,安卓模拟器多开挂手游改IP防封号技术讲解
  9. C语言程序设计答何钦铭答案,c语言程序设计何钦铭课后题答案
  10. Java 导入导出Excel
  11. 管理储存组和邮箱数据库
  12. micro hdmi引脚定义义_臻实力芯定义:京东AMD笔记本电脑双11开门红
  13. IDEA 集成Statistic插件
  14. 美国 android手机号码,格式编辑文本为美国电话号码1(xxx)-xxxx你输入android?
  15. HBase Shell常用命令
  16. 十四、策略模式——你要黄焖鸡、手撕鸡、大盘鸡、叫花鸡都可以,指定一个吧
  17. [Western CTF 2018]shrine
  18. Win10电脑开机进不去系统怎么修复
  19. 微信小程序实现关注与取消关注功能
  20. TPM分析笔记(一) TPM历史

热门文章

  1. 利用JWT安全验证(前后端分离,单点登录,分布式微服务)
  2. Codeforces Round #670 (Div. 2) C D E
  3. VS2010 MVC4下载地址
  4. 简单的《找不同汉字版》,来考考你的眼力吧
  5. u盘打开提示格式化怎么办?有用的方法来了
  6. 2020计算机夏令营+预推免统计
  7. AMA指标代码逐一解释,附源码(python)
  8. 通过windows自带远程桌面,实现不同局域网的电脑相互访问(默默P2P远程桌面管理工具-直接内网穿透)
  9. 学人工智能有前途吗?AI发展前景怎么样?
  10. 中国人民解放军郑州计算机学院官网,解放军信息工程大学录取分数线2021