首页 > 数据库 >SQLSERVER 动态生成列、合计行

SQLSERVER 动态生成列、合计行

时间:2023-04-28 09:12:48浏览次数:36  
标签:join -- sql1 SQLSERVER 生成 amount position 动态 goodsno

/*

 
test110 '2023-04-26','2023-04-26','全部','901100569,901100570,901100571,901100572,901100573';
 
*/
ALTER  PROCEDURE [dbo].[test110]
    @StartDate  datetime,
    @EndDate  datetime ,
    @uname VARCHAR(50)='全部',
    @goodslist  VARCHAR(MAX) 
 
AS      
    set nocount on

 SET @EndDate=@EndDate+1
create table #t1(  
goodsno varchar(50)    
)   


create table #dtzd(  
column_name varchar(1150)   ,
ordinal_position int
 
)   

declare @sql varchar(MAX)
set @sql='insert into #t1(goodsno) select col='''+ replace(@goodslist,',',''' union all select ''')+''''
 PRINT @sql
exec (@sql)
 
 /*保存基础数据*/
select  a.num,a.md_uid,e.uname,b.sale_man,f.work_no,f.pname,b.gid,
 ( b.SUM_SALE ) jine, ( b.amount ) amount--,count(DISTINCT a.num) as rc
 into #raw1
from  td_outhead a with(nolock)
join td_outvoice b with(nolock) on(a.num=b.num)
 join tr_matecode c with(nolock) on(b.gid=c.gid)        
--join TD_PAY_INFO d with(nolock) on a.num=d.num       
join tr_unit  e with(nolock) on a.md_uid=e.uid    
join  #t1 X on X.goodsno=c.goodsno
LEFT JOIN tr_person f with(nolock) on b.sale_man= f.pid
where a.cw_date>=@StartDate and  a.cw_date <@EndDate                         
and( uname=@uname or @uname='全部')
-- group by a.md_uid,uname,b.sale_man,f.work_no,f.pname  
ORDER BY  a.md_uid,f.work_no  ;



 
 declare @sql1 varchar(max)
 set @sql1='SELECT a.md_uid,[uname] as 门店名称,[work_no] as 工号,[pname] 销售员 ,convert( DECIMAL(12,2),sum(a.jine)) as 总金额,
convert( DECIMAL(12,2),sum(a.amount)) as 总数量,count(DISTINCT a.num) as 单据数'

select @sql1=@sql1+' , convert( DECIMAL(12,2),sum(case gid when '''+ CONVERT(VARCHAR(10),b.gid) +''' then a.jine else 0 end) ) as  ['+
 CONVERT(VARCHAR(10),b.goodsno)+'/<br/>'+ b.comname +'/<br/>'+b.spec+'(金额)]'

+' , convert( DECIMAL(12,2),sum(case gid when '''+ CONVERT(VARCHAR(10),b.gid) +''' then a.amount else 0 end)) as  ['+
CONVERT(VARCHAR(10),b.goodsno)+'/<br/>'+ b.comname +'/<br/>'+b.spec+'(数量)]'
 
from #t1 a join TR_MATECODE b on a.goodsno=b.goodsno ORDER BY a.goodsno
set @sql1=@sql1+'  into #res
 from #raw1 a  
GROUP BY a.md_uid,[uname],[work_no],[pname]  order by a.md_uid,[work_no] ;

 
 insert into #dtzd(column_name,ordinal_position)
SELECT column_name,ordinal_position    --获取自动生成的列名字
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME =
    object_name(
        object_id(''tempdb..#res''),
        (SELECT database_id FROM sys.databases WHERE name = ''tempdb''))
and ordinal_position>4   -- 第5列开始计算合计值
order by ordinal_position;
 

 
'

 
 exec(@sql1) ; /*执行一次给  #dtzd  赋值*/

set  @sql1=@sql1+' SELECT * from #res   union all select null, ''合计:'', null, null'  -- 第5列开始计算合计值

 select @sql1=@sql1+' ,sum(['+column_name+'])   '

from  #dtzd order by ordinal_position;

set  @sql1=@sql1+' from #res '
 PRINT(@sql1);
 exec(@sql1) ;


  --SELECT * from #dtzd 


/*--OLD


SELECT  md_uid,uname,sale_man,work_no,pname, CONVERT(DECIMAL(12,2),jine) as jine, CONVERT(float,amount) as amount,rc   from #res
union ALL
SELECT   NULL,'合计:',NULL,NULL,NULL, CONVERT(DECIMAL(12,2), sum(jine) ) as   jine, CONVERT(float, sum(amount) ) as   amount,
sum(rc) from #res
*/

 

标签:join,--,sql1,SQLSERVER,生成,amount,position,动态,goodsno
From: https://www.cnblogs.com/agfox123/p/17360904.html

相关文章

  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......
  • SQLServer2005 AMD8450,3核CPU装不上sql 2005的解决办法
    中午12点开始,安装SQLServer2005,一直到晚上9点半,把网上的各个文章翻了个遍,依然没有安装上我的SQLServer2005,安装不上的症状跟网上其它人遇到的一样,可是为什么别人的就解决了,我的就不行呢```带着郁闷的心情睡觉了```夜里3点几分,起夜,想到数据库还......
  • iOS MachineLearning 系列(9)—— 人物蒙版图生成
    iOSMachineLearning系列(9)——人物蒙版图生成人物蒙版图能力是Vision框架在iOS15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。1-人物蒙版的提取首......
  • CF1814E Chain Chips & CF750E New Year and Old Subsequence - 动态 dp -
    一句话概括动态dp:用来解决带修改/多次区间询问的dp问题。将转移写成矩阵的形式,然后利用线段树求解区间问题/单点修改1814E注意一条边要么选2要么选0次,而且第一条边一定是选了2次。如果有一条边没选,那么这条边两侧的边一定都选了。设\(f_i\)代表考虑到第\(i\)条边,......
  • 找出SQLServer数据库I/O高的原因
    找出SQLServer数据库I/O高的原因影响SQLServer性能的因素有很多,比如CPU、I/O、内存、错误的执行计划、不恰当的索引或缺少索引等。当查询变慢时,我发现最常见的一件事是由于查询执行的I/O太大。当一个查询因为I/O而变慢时,可能是因为糟糕的硬件、糟糕的执行计划,但通常是糟糕的数据......
  • C#高性能动态获取对象属性值的步骤
    动态获取对象的性能值,这个在开发过程中经常会遇到,这里我们探讨一下何如高性能的获取属性值。为了对比测试,我们定义一个类PeoplepublicclassPeople{publicstringName{get;set;}}然后通过直接代码调用方式来取1千万次看要花多少时间:privatestaticvoidDirectly......
  • 使用CGLIB生成代理
    知识点【使用前提条件:【/**如果这个代理的类没有实现接口就不能使用JDK中的动态代理*这时需要使用第三方的.jarCGLIB实现代理**/】publicclassCGLIBProxyimplementsMethodInterceptor{privateObjecttar......
  • JDK动态代理
    知识点【publicclassJDKProxyimplementsInvocationHandler{privateObjecttargetObject;//代理的目标对象publicObjectcreateProxyInstance(ObjecttargetObject){this.targetObject=targetObject;/**第一个参数设置代码使......
  • mybatis控制动态SQL拼接标签之foreach标签
    mybatis控制动态SQL拼接标签之foreach标签foreach标签主要用于构建in条件,可在sql中对集合进行迭代。也常用到批量删除、添加等操作中。这个标签在实际业务中非常常用,当然运维旧项目也会发现,有些坑,用java循环执行sql来表示批量插入。属性说明:collection:collection属性的值有三......
  • Sqlserver修改表结构提示不允许保存更改。
    在现有的表中去修改或者增加表字段的时候就会提示:不允许保存更改。您所做的更改要求删除并创建一下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项。、如何解决问题:操作步骤:点击“工具”→“选项”→"打开弹窗中选择(设计器)" →"表设......