做项目时,用到了汇总统计的行转列,且

表结构:

具体存储过程脚本如下:

-- =============================================
-- 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 不确定列 行转列操作的更多相关文章

  1. Sql server 中将数据行转列列转行(二)

    老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...

  2. 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 ...

  3. Sql server 中将数据行转列列转行(一)

    在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...

  4. SQL SERVER pivot(行转列),unpivot(列转行)

    [pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...

  5. SQL面试题之行转列

    典型的课程表: mysql> select * from course; +----+------------+----------+------------+ | id | teacher_i ...

  6. sql里的多行多列转一行多列小技巧

    ---恢复内容开始--- [ 今天下午接受了一个紧急小任务,是将一组比赛记录统计出来,将象棋游戏玩家的两条记录在一行里面显示,进数据库看之后是首先想到的是行转列,但是一开始就觉得不对,后来写到一半确实 ...

  7. Pandas之csv文件对列行的相关操作

    1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) #axis=1就是删除列 df.drop(['列名1','列名2'] ...

  8. 做图表统计你需要掌握SQL Server 行转列和列转行

    说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...

  9. SQLServer处理行转列和列转行

    掌握SQL Server 行转列和列转行 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 ...

随机推荐

  1. innodb事务日志详解

    首先看InnoDB的缓存和文件的关系图如下: InnoDB事务日志功能介绍 InnoDB使用日志来减少提交事务时的开销.因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新(flush) ...

  2. mysql 内存体系结构--session

    体系结构tmp_table_size & max_heap_table_size ,这个是会话级的内存结构mysql使用总内存 = global_buffers + thread_buffer ...

  3. web deploy 部署网站

    一.服务端配置 1. 确保在服务器端(我目前是win server 2012 R2)安装管理服务 安装后服务器会重启, 2)安装webdeploy http://www.iis.net/downloa ...

  4. Deep Learning 学习笔记(2):多参数的线性回归

    上次用简单地介绍了线性回归的模型和梯度下降获得参数方程的方法. 用到的一个十分简单的参数方程h(x)=theta0+theta1*x 在现实问题中,参数方程能要复杂许多, 不只有一个未知量x,可能有多 ...

  5. Theos初步

    [Theos初步] 1.安装Theos.Theos需要在mac和ios上均安装,ios上安装的是Theos服务器,以使得mac的thoes可以直接安装app到ios设备上.如果不需要使用此功能,则仅安 ...

  6. Oracle 环境下 GoldenGate 集成抽取(Integrated Capture)模式与传统抽取模式(Classic Capture)间的切换

    检查抽取进程模式 在 GGSCI 环境下,执行类似如下语句查看特定进程的状态. GGSCI> info <Group_Name> 其中,<Group_Name> 为进程名 ...

  7. linux下rsync命令详细整理

    点评:rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一详细说明,需要了解的朋友可以参考下-在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命 ...

  8. 把dataTable表批量的写入数据库

    connectionStr:链接字符串:dataTableName数据库中的表:sourceDataTable dataTable的名称 public static void SqlBulkCopyB ...

  9. 关于windows的锁定状态

    本来以为要在项目里用上的,现在看来不需要了,把相关的函数列一下吧,以后如果用到了,再写详细点 锁定计算机 : LockWorkStation 注册Windows状态变化的监听函数: BOOL WTSR ...

  10. Junit问题01 利用 @Autowired 注入失效问题

    1 利用 @Autowired 注入失效问题 1.1 问题描述 在使用Junit作为测试框架的单元测试中,直接了用@Autowired记性依赖注入时总是注入失败 1.2 问题原因 在测试类中没有设定上 ...