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 ...
随机推荐
- C# 32位程序访问64位注册表
接上文:http://www.cnblogs.com/TaiYangXiManYouZhe/p/5086974.html 上代码: RegistryKey localKey; if (Environm ...
- oracle11.2 安装
win10安装oracle 11g 时出现INS-13001环境不满足最低要求 oracle在win10上安装教程
- Redis存储AccessToken
AccessToken 2小时有效. 就不要每次都调取了,这样会造成浪费. 或者存入Session中,设置过期时间. 或者存入Redis中,设置过期时间. 过期之后,进行重新获取. <?php ...
- 查询mysql 哪些表正在被锁状态
查询mysql 哪些表正在被锁状态 show OPEN TABLES where In_use > 0; 参考链接:http://zhidao.baidu.com/link?url=tCQ70t ...
- JeeSite基础知识(一)
- Linux - 创建用户的相关文件
创建一个用户会与 6 个文件相关 /etc/passwd 储存了所有用户的相关信息 第一行中,从左往右 root 为用户名,: 为分隔符,x 为密码,0 为 uid,0 为 gid,root 为用户的 ...
- Linux性能监测:CPU篇
CPU 也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,用来管理和分配 CPU 资源,合理安排进程抢占 CPU,并决定哪个进程 ...
- 第十二章 MySQL触发器(待续)
······
- Halcon学习之两幅图像处理
sub_image ( ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : ) 对两幅图像做减法 g' := (g1 - g2) * Mu ...
- kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解)
对于Kibana ,我们知道,是Elasticsearch/Logstash/Kibana的必不可少成员. 第一步:进入Elasticsearch的官网 https://www.elastic.co/ ...