有一表A
id date name
1 2007-01-01 CCC
1 2007-01-01 DDD
1 2007-01-01 VV
1 2007-02-01 TTTTT
2 2007-01-01 GG
3 2007-01-02 CCC
3 2007-01-01 CCC
4 2007-01-04 YY
输入1月要得到
日期 CCC DDD VV GG YY
1号 2 1 1 1 0
2号 1 0 0 0 0
3号 0 0 0 0 0
4号 0 0 0 0 1
. 0 0 0 0 0
. 0 0 0 0 0
. 0 0 0 0 0
31号 0 0 0 0 0
合计 3 1 1 1 1
CREATE TABLE A(id int, date datetime, name varchar(10))
INSERT A SELECT 1, '2007-01-01', 'CCC'
UNION ALL SELECT 1, '2007-01-01', 'DDD'
UNION ALL SELECT 1, '2007-01-01', 'VV'
UNION ALL SELECT 1, '2007-02-01', 'TTTTT'
UNION ALL SELECT 2, '2007-01-01', 'GG'
UNION ALL SELECT 3, '2007-01-02', 'CCC'
UNION ALL SELECT 3, '2007-01-01', 'CCC'
UNION ALL SELECT 4, '2007-01-04', 'YY'
GO
-- 查询的存储过程
CREATE PROC p_qry
@yearmonth int
AS
SET NOCOUNT ON
DECLARE @BeginDate datetime, @EndDate datetime, @row int
SELECT
@BeginDate = CONVERT(datetime, RIGHT(@yearmonth * 100 + 1, 8)),
@EndDate = DATEADD(Month, 1, @BeginDate),
@row = Day(@EndDate - 1)
DECLARE @dt TABLE(id int identity(1, 1), date datetime)
SET ROWCOUNT @row
INSERT @dt(date) SELECT NULL FROM syscolumns A, syscolumns B
SET ROWCOUNT 0
UPDATE @dt SET date = DATEADD(Day, id - 1, @BeginDate)
SELECT
日期 = CASE GROUPING(D.id)
WHEN 0 THEN CONVERT(varchar(10), D.id) + '号'
ELSE '合计' END,
CCC = ISNULL(SUM(CASE A.name WHEN 'CCC' THEN 1 ELSE 0 END), 0),
DDD = ISNULL(SUM(CASE A.name WHEN 'DDD' THEN 1 ELSE 0 END), 0),
VV = ISNULL(SUM(CASE A.name WHEN 'VV' THEN 1 ELSE 0 END), 0),
GG = ISNULL(SUM(CASE A.name WHEN 'GG' THEN 1 ELSE 0 END), 0),
YY = ISNULL(SUM(CASE A.name WHEN 'YY' THEN 1 ELSE 0 END), 0)
FROM(
SELECT * FROM A
WHERE date > @BeginDate
AND date < @EndDate
)A
RIGHT JOIN @dt D
ON A.date = D.date
GROUP BY D.ID WITH ROLLUP
ORDER BY GROUPING(D.id), D.id
GO
-- 调用
EXEC p_qry 200601
GO
-- 删除测试
DROP TABLE A
DROP PROC P_qry
-- 调用
EXEC p_qry 200701
-- 结果:
日期CCCDDDVVGGYY
1号00000
2号10000
3号00000
4号00001
5号00000
6号00000
7号00000
8号00000
9号00000
10号00000
11号00000
12号00000
13号00000
14号00000
15号00000
16号00000
17号00000
18号00000
19号00000
20号00000
21号00000
22号00000
23号00000
24号00000
25号00000
26号00000
27号00000
28号00000
29号00000
30号00000
31号00000
合计10001
如果要根据满足条件的name的值来动态确定列名, 则存储过程改为:
-- 查询的存储过程
CREATE PROC p_qry
@yearmonth int
AS
SET NOCOUNT ON
DECLARE @BeginDate datetime, @EndDate datetime, @row int
SELECT
@BeginDate = CONVERT(datetime, RIGHT(@yearmonth * 100 + 1, 8)),
@EndDate = DATEADD(Month, 1, @BeginDate),
@row = Day(@EndDate - 1)
DECLARE @dt TABLE(id int identity(1, 1), date datetime)
SET ROWCOUNT @row
INSERT @dt(date) SELECT NULL FROM syscolumns A, syscolumns B
SET ROWCOUNT 0
UPDATE @dt SET date = DATEADD(Day, id - 1, @BeginDate)
DECLARE @s nvarchar(4000)
SET @s = ''
SELECT @s = @s + ',' + QUOTENAME(name)
+ '= ISNULL(SUM(CASE A.name WHEN ' + QUOTENAME(name, '''') + ' THEN 1 ELSE 0 END), 0)'
FROM(
SELECT DISTINCT name FROM A
WHERE date > @BeginDate
AND date < @EndDate
)A
IF @@ROWCOUNT = 0
RETURN
SET @s = '
DECLARE @dt TABLE(id int identity(1, 1), date datetime)
SET ROWCOUNT @row
INSERT @dt(date) SELECT NULL FROM syscolumns A, syscolumns B
SET ROWCOUNT 0
UPDATE @dt SET date = DATEADD(Day, id - 1, @BeginDate)
SELECT
日期 = CASE GROUPING(D.id)
WHEN 0 THEN CONVERT(varchar(10), D.id) + ''号''
ELSE ''合计'' END' + @s + '
FROM(
SELECT * FROM A
WHERE date > @BeginDate
AND date < @EndDate
)A
RIGHT JOIN @dt D
ON A.date = D.date
GROUP BY D.ID WITH ROLLUP
ORDER BY GROUPING(D.id), D.id
'
EXEC sp_executesql @s, N'@row int, @BeginDate datetime, @EndDate datetime', @row, @BeginDate, @EndDate
GO
WHERE date > =@BeginDate
AND date <= @EndDate
这句改了就还了,差个"="
好的给分
分享到:
相关推荐
使用flink-connector-sqlserver-cdc 2.3.0把数据从SQL Server实时同步到MySQL中。
当MS-SQLServer数据库显示为置疑时,可以用它来修复
MS-SQL Server杂志-事务全攻略 SQL Server安全,管理,语法,应用等几大块
资源名称:MS-SQL SERVER从字符串中搜索符合指定范围的数值资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
CLR扩展DLL 在MS-SQL Server 环境中实现文件、目录操作,程序使用VS2010编写,语言Vb.net。运行起来飞一般的感觉! 包含文件、目录操作的常用20多个函数,支持网络访问文件。 我经过5~6年的使用,实现用SQL管理复杂...
SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,在企业中...但是在SQL Server的使用管理中会出现这样那样是问题,本刊整理了MS-SQL Server热点讨论问题,方便大家讨论和参考。
数据库驱动程序包(ms-sqlserver,sqlServer,oracle,mysql)
SQL基础_-_MS-SQL_Server___基础类SQL基础_-_MS-SQL_Server___基础类SQL基础_-_MS-SQL_Server___基础类
利用Nmap对MS-SQLSERVER进行渗透.pdf
其中包含Sqoop将SqlServer文件导入HDFS文件的所有jar包
java 连接sqlserver使用的java-sqlserver-connect.jar包。 java连接sqlserver使用的jar包,包含jre7、jre8两种使用 sqlserver.ja
基于java的开发源码-sqlserver做的员工管理系统.zip 基于java的开发源码-sqlserver做的员工管理系统.zip 基于java的开发源码-sqlserver做的员工管理系统.zip 基于java的开发源码-sqlserver做的员工管理系统.zip 基于...
sql server2008 cdc 数据实时同步到kafka,Debezium是捕获数据实时动态变化的开源的分布式同步平台。能实时捕获到数据源(Mysql、Mongo、PostgreSql)的:新增(inserts)、更新(updates)、删除(deletes)操作,实时...
jTDS - SQL Server and Sybase JDBC driver 1.2.2 正式版 <br>一个Microsoft SQL Server数据库的Jdbc driver。开源的非常好用。 下载地址:http://jtds.sourceforge.net/<br><br><br>
在PB中实现MS-SQL Server中的功能.pdf
IBM DB2、Oracle、MS-SQL Server、MySQL常用数据库数据迁移
数据库技术与应用--SQL Server 2005教程(詹英主编)数据库技术与应用--SQL Server 2005教程(詹英主编)
Veritas-NetBackup-5.1设置MS-SQLServer-2000的备份策略的典型配置.docx
该书解释并比较了sql server 2000和sql server 2005在数据库开发相关问题上的解决方案,深入讨论了sql server 2005中新增的t-sql编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...
wamp下对MS-SQLSERVER的连接配置-PHP-THINKPHP5通过.doc