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 ...
随机推荐
- java从键盘输入若干数,求其最大值,最小值,平均值。等等
总结:有一定基础的人,应该发现第一个程序可以运行,其实它有个致命的错误.有谁能一眼看出来呢?第二个程序是对的. 这个题目求最大值,最小值,平均值我不会求,不知道这个if判断放在类的外面还是main函数 ...
- PHP base64多图片上传
// 多图片上传,base64 public function upload_multi() { $pic = $_POST['pic']; if (!$pic) { $this->json-& ...
- vs2017 android demo
vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...
- oracle查看表空间和物理文件大小
查看各表空间的使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/102 ...
- 用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性
网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以用日常生活中的常见事物——盒子作一 ...
- 第一章 初识MySQL(待续)
···········
- Python——string
字符串操作 string典型的内置方法: count() center() startswith() find() format() lower() upper() strip() replace() ...
- windows下利用VMware安装mac:构建…
安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC. 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启. 关于如何检测你的电脑 ...
- fgets、gets和scanf的区别
gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中.换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字 ...
- mysql日期获取
获取当前日期在本周的周一:select subdate(curdate(),date_format(curdate(),'%w')-1) 获取当前日期在本周的周日:select subdate(cur ...