Sql 不确定列 行转列操作
做项目时,用到了汇总统计的行转列,且
表结构:

具体存储过程脚本如下:
-- =============================================
-- Author:
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[cp_Material_PutOutCostStat_StatDay_GetFeedConsumeList]
@Page INT ,
@PageSize INT ,
@LineID VARCHAR(512),
@StartDate DATE,
@EndDate DATE,
@OrderColumn VARCHAR(512),
@RowCount INT OUTPUT
AS
BEGIN
DECLARE @iBeginID INT
DECLARE @iEndID INT
SET NOCOUNT ON
SET @iBeginID = ( @Page - 1 ) * @PageSize + 1
SET @iEndID = @iBeginID + @PageSize - 1
SET @RowCount = 0;
--汇总项:猪阶段类型(IN)
DECLARE @PigStageType VARCHAR(128);
--查询 增加Isnull
DECLARE @PigStageTypeSelect VARCHAR(256);
--单行合计
DECLARE @PigStageTypeRowSum VARCHAR(256);
--整列合计
DECLARE @PigStageTypeColSum VARCHAR(256);
SET @PigStageType = (SELECT '[' + CONVERT(VARCHAR(10), ID) + '],' FROM View_PigMGT_Dict_Dict_PigStage WITH(NOLOCK) FOR XML PATH(''));
SET @PigStageTypeSelect = (SELECT 'ISNULL([' + CONVERT(VARCHAR(10),ID) + '],0) AS [' + CONVERT(VARCHAR(10), ID)+ '],' FROM View_PigMGT_Dict_Dict_PigStage WITH(NOLOCK) FOR XML PATH(''));
SET @PigStageTypeRowSum = (SELECT 'ISNULL([' + CONVERT(VARCHAR(10),ID) + '],0) +' FROM View_PigMGT_Dict_Dict_PigStage WITH(NOLOCK) FOR XML PATH(''));
SET @PigStageTypeColSum = (SELECT 'SUM(ISNULL([' + CONVERT(VARCHAR(10),ID) + '],0)) AS [' + CONVERT(VARCHAR(10), ID)+ '],' FROM View_PigMGT_Dict_Dict_PigStage WITH(NOLOCK) FOR XML PATH(''));
SET @PigStageType = SUBSTRING(@PigStageType,0,LEN(@PigStageType));
SET @PigStageTypeSelect = SUBSTRING(@PigStageTypeSelect,0,LEN(@PigStageTypeSelect));
SET @PigStageTypeRowSum = SUBSTRING(@PigStageTypeRowSum,0,LEN(@PigStageTypeRowSum));
SET @PigStageTypeColSum = SUBSTRING(@PigStageTypeColSum,0,LEN(@PigStageTypeColSum));
DECLARE @SQL_WHERE NVARCHAR(MAX) = N'';
DECLARE @SQL_CONTENT NVARCHAR(MAX) = N'';
SET @SQL_WHERE += N' WHERE 1=1 ';
IF(LEN(@LineID) > 0)
BEGIN
SET @SQL_WHERE += N'
AND t1.LineID IN(SELECT * FROM [dbo].[Split] (@LineID))
';
END
SET @SQL_WHERE += N'
AND t1.StatDate BETWEEN @StartDate AND @EndDate';
--如果没有传递排序参数,默认根据数量降序
IF (@OrderColumn ='')
SET @OrderColumn='LineID ASC'
SET @SQL_CONTENT = N'
SELECT @RowCount = COUNT(C.MaterialID)
FROM (
SELECT * FROM
(
SELECT
t1.LineID,
t1.MaterialID
FROM Material_PutOutCostStat_StatDay AS t1 WITH ( NOLOCK )
LEFT JOIN [dbo].[View_PigMGT_Material_Info] AS t2 WITH (NOLOCK) ON t2.ID = t1.MaterialID
@WHERE
) AS t1
PIVOT( SUM(t1.StatNum)
FOR PigStageID IN ('+@PigStageType+' )
) A
)C
IF( @RowCount>0)
BEGIN
;WITH t AS (
SELECT ROW_NUMBER() OVER (ORDER BY '+ @OrderColumn +' ) AS R_Number, C.*
FROM (
SELECT
LineID,
LineName,
MaterialID,
[MaterialName],
'+@PigStageTypeSelect+',
'+@PigStageTypeRowSum+' AS SumStat --汇总行
FROM
(
SELECT
t1.LineID,
t1.MaterialID ,
t2.[MaterialCode],
t1.PigStageID,
ISNULL(t1.StatNum,0) AS StatNum
FROM Material_PutOutCostStat_StatDay AS t1 WITH(NOLOCK )
LEFT JOIN [dbo].[View_PigMGT_Material_Info] AS t2 WITH(NOLOCK) ON t2.ID = t1.MaterialID
@WHERE
) AS t1
PIVOT( SUM(t1.StatNum) FOR PigStageID IN ('+@PigStageType+' )
) A
)C)
--添加汇总行
SELECT * INTO #table FROM t
UPDATE #table SET R_Number=R_Number+1
INSERT INTO #table
SELECT
1,
0,
''合计'',
'''',
'''',
'''',
'''',
'''',
'''',
'''',
' + @PigStageTypeColSum + ',
SUM([SumStat])
FROM #table
SELECT * FROM #table
WHERE R_Number BETWEEN @iBeginID AND @iEndID
ORDER BY R_Number ;
END
'
SET @SQL_CONTENT = REPLACE(@SQL_CONTENT, '@WHERE', @SQL_WHERE)
PRINT @SQL_CONTENT
EXECUTE sp_executesql @SQL_CONTENT,
N'@RowCount INT OUTPUT,@iBeginID INT,@iEndID INT, @LineID VARCHAR(512),@StartDate DATE,@EndDate DATE,@OrderColumn VARCHAR(512) ',
@RowCount = @RowCount OUTPUT, @iBeginID = @iBeginID, @iEndID = @iEndID,@LineID = @LineID ,
@StartDate = @StartDate, @EndDate = @EndDate,@OrderColumn = @OrderColumn;
END
查询效果如下:

页面展示如下:

Sql 不确定列 行转列操作的更多相关文章
- Sql server 中将数据行转列列转行(二)
老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...
- Oracle中用一条Sql实现任意的行转列拼接 多行拼接
表结构和数据如下(表名Test): NO VALUE NAME 1 a 测试1 1 b 测试2 1 c 测试3 1 d 测试4 2 e 测试5 4 f 测试6 4 g 测试7 Sql语句: selec ...
- Sql server 中将数据行转列列转行(一)
在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...
- SQL SERVER pivot(行转列),unpivot(列转行)
[pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...
- SQL面试题之行转列
典型的课程表: mysql> select * from course; +----+------------+----------+------------+ | id | teacher_i ...
- sql里的多行多列转一行多列小技巧
---恢复内容开始--- [ 今天下午接受了一个紧急小任务,是将一组比赛记录统计出来,将象棋游戏玩家的两条记录在一行里面显示,进数据库看之后是首先想到的是行转列,但是一开始就觉得不对,后来写到一半确实 ...
- Pandas之csv文件对列行的相关操作
1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) #axis=1就是删除列 df.drop(['列名1','列名2'] ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- SQLServer处理行转列和列转行
掌握SQL Server 行转列和列转行 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 ...
随机推荐
- 分布式缓存系统 Memcached 哈希表操作
memcached 中有两张hash 表,一个是“主hash 表”(primary_hashtable),另外一个是“原hash 表”(old_hashtable).一般情况下都在主表中接受操作,在插 ...
- NOIP2008普及组第3题 传球游戏
NOIP2008普及组第3题 传球游戏 时间限制: 1 Sec 内存限制: 128 MB提交: 29 解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 上体育课的时候,小蛮的老 ...
- 学习笔记::fft
上次学fft还是5月份,昨天发现已经忘记怎么推导了,代码也看不懂了,就又学习了一发,大概是看menci的博客 0.fft可以进行多项式乘法,朴素的乘法跟手算一样是O(n^2),fft可以通过分治做到n ...
- 7.solr学习速成之facet
Facet 介绍 Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计. 比如你上淘宝, ...
- MongoDB 学习笔记(一)—— 安装入门
注:我的环境是win7 32位. 下载安装 http://www.mongodb.org/downloads 解压即可.这里我重命名“mongodb”,存放的目录为E:\mongodb. 新建数据文件 ...
- FFmpeg新版本(2016年10月份以后) 支持硬件解码
FFmpeg provides a subsystem for hardware acceleration. Hardware acceleration allows to use specific ...
- mysql 批量插入与单条插入 的效率比较
1.数据插入性能(单个插入和批量插入) public class Test { private Long id; private String test; public Long getId() { ...
- python实现文件下载的方法总结
前端时间遇到一个通过url下载文件的需求,只需要简单的编写一个py脚本即可.从网上搜了下python实现文件下载的方法,总结如下,备查. 以下方法均已测试,环境win8.1 python2.6/2. ...
- Redis搭建(四):Sharding集群模式
一. 方案 1. 介绍redis集群分为服务端集群(Cluster)和客户端分片(Sharding)服务端集群:redis3.0以上版本实现,使用哈希槽,计算key的CRC16结果再模16834.此处 ...
- copyWithZone详解
[copyWithZone详解] NSObject实现了-copy.+copy.+copyWithZone方法.代码如下: + (id)copy { return (id)self; } + (id) ...