報表常用語句(1)
来源:互联网 发布:最新工程造价软件 编辑:程序博客网 时间:2024/06/04 18:55
1. 分級汇总
生成測試數據:
CREATE TABLE [dbo].[门店顺序]([地区] [nvarchar](20), [层次类型] [nchar](10), [分组] [nchar](10) ,[门店名称] [nvarchar](50) ,[营业额] [float] ,[id] [float] ,) ON [PRIMARY]GOINSERT INTO 门店顺序 VALUES('上海',6,'运营' , '百联世茂店',100,1)INSERT INTO 门店顺序 VALUES('上海',2,'运营' , '古北店',200 ,2)INSERT INTO 门店顺序 VALUES('上海',2,'运营' , '金茂店',300,3)INSERT INTO 门店顺序 VALUES('上海',NULL,NULL,'百联世茂店',400,4)INSERT INTO 门店顺序 VALUES('北京',1,'运营' , '金融街店',500,5)INSERT INTO 门店顺序 VALUES('北京',8,'运营' , '北京凯德店',500,6)INSERT INTO 门店顺序 VALUES('北京',1,'运营' , '新国贸店',700,7)INSERT INTO 门店顺序 VALUES('北京',8,'运营' , '新国贸店',200,8)INSERT INTO 门店顺序 VALUES('北京',3,NULL,'东方广场',300,9)INSERT INTO 门店顺序 VALUES('北京',3,NULL,'都汇天地店',500,10)GO
需求描述:
從門店由小到大汇总到分組、地區、全國。門店順序要按id升序(難點:要按指定順序排序,分組爲空的話要把這些門店單獨放地區各運營組之後)
變成
思路:看到分級汇总,就應該想到用之前熟悉過的 Grouping 函數,如果不熟悉可以去看看。先實現一個大致框架,再去調整細節,我下面給出的一個答案,大致框架就是子查詢,外面的一系列過濾與排序就是調整細節。
SELECT 层次类型, 地区, 门店名称, 营业额FROM (SELECT CASE WHEN GROUPING(门店名称) = 0 THEN ISNULL(MAX(层次类型), '') ELSE '' END 层次类型 , CASE WHEN GROUPING(地区) = 1 THEN '全国' ELSE 地区 END 地区 , CASE WHEN GROUPING(门店名称) = 0 THEN 门店名称 WHEN GROUPING(门店名称) = 1 AND GROUPING(分组) = 0 THEN 分组 ELSE '总计' END 门店名称 , MAX(id) 'max_id', SUM(营业额) 营业额 FROM 门店顺序 GROUP BY 地区 ,分组 ,门店名称 WITH ROLLUP) aWHERE 门店名称 IS NOT NULLORDER BY max_id , CASE WHEN 门店名称 IN ( SELECT [门店名称] FROM 门店顺序 ) THEN 0 ELSE 1 END , CASE 地区 WHEN '全国' THEN 1 ELSE 0 END
2. 合併列值
生成測試數據:
CREATE TABLE tb(id VARCHAR(10), col1 VARCHAR(10), col2 VARCHAR(10), col3 VARCHAR(10))GOINSERT tbSELECT '001', 'text11', '2010-1-1', '2010-6-2' UNION ALLSELECT '001', 'text12', '2010-2-1', '2010-8-9' UNION ALLSELECT '001', 'text13', '2010-3-1', '2010-10-8' UNION ALLSELECT '002', 'text21', '2010-4-1', '2010-8-9' UNION ALLSELECT '002', 'text22', '2010-5-1', NULLGO
需求:
變成:
思路:這個之前也有熟悉過,但那只有一列要合併,這裏是多列,所以那篇文章裏的第一種方法就顯得有點蹩腳,還是for xml path 好用呀:
SELECT DISTINCT id,STUFF((SELECT ','+col1 FROM tb WHERE id = a.id FOR XML PATH('')),1,1,'') col1,STUFF((SELECT ','+col2 FROM tb WHERE id = a.id FOR XML PATH('')),1,1,'') col2,STUFF((SELECT ','+col3 FROM tb WHERE id = a.id FOR XML PATH('')),1,1,'') col3FROM tb a
3. 拆分 + 行轉列
奇葩地將
變成:
這個需求太奇葩,有必要專門寫一篇博文。請猛擊 這裏。
- 報表常用語句(1)
- 英語常用句
- JavaScript常用語句
- 常用SQL語句
- JavaScript常用語句
- 數據庫相關檢測修復常用語句
- JavaScript 常用語句
- JavaScript常用語句
- JavaScript常用語句
- JavaScript常用語句
- 常用英语1000句1
- 英语口语-常用短语句1
- 1000句最常用英语口语 (1~500)
- 最常用口语1000句(1-500)
- SQL Server的一些常用語句
- oracle dba 常用sql語句
- oracle dba 常用sql語句
- oracle dba 常用sql語句
- node.js入门
- Unity 3D--外部加载资源AssetBundles
- 解决运行eclipse时出现的错误Failed to load the JNI shared library
- 项目计划的编制过程
- linux修改/etc/hosts
- 報表常用語句(1)
- 1018骨牌铺方格
- 【Android Training - 06】分享数据内容 [Lesson 1 - 发送分享的数据到其他App]
- 用C#读xml文档(流模型)
- oracle 行转列 列转行
- 【Android Training - 06】分享数据内容 [Lesson 2 - 从其它app接收分享的内容]
- 注册广播的两种方法
- 关闭Ubuntu 12.04的内部错误提示
- 有关相册访问