繁体   English   中英

如何在SQL Server 2012中使用存储过程将多行合并为一行?

[英]How to merge multiple rows into one row using stored procedure in sql server 2012?

三张桌子

  1. 资产:AssetId,已删除
  2. 跟踪:TrackingId,AssetId,TrackingStatusId,TrackingDate
  3. TrackingStatus:TrackingStatusId,TrackingStatusName,IsDeleted

我要制作“资产与状态对比图”表示在特定状态下有多少百分比的资产可用。

存储过程:

CREATE proc [dbo].[Sp_Asset_VS_Status] 

@TimeSpan nvarchar(30),
@Duration int    

as    

begin    

Declare @TotalAsset int;  

select @TotalAsset=COUNT(AssetId) from Asset where Isdeleted=0  

if @TotalAsset>0

Begin  

if @TimeSpan='h'

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
and Tracking.TrackingDate between DATEADD(HOUR,-@Duration,GETDATE()) and GETDATE()
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  
End

else if @TimeSpan='d'

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
and Tracking.TrackingDate between DATEADD(DAY,-@Duration,GETDATE()) and GETDATE()
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  
End

else if @TimeSpan='w'

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
and Tracking.TrackingDate between DATEADD(WEEK,-@Duration,GETDATE()) and GETDATE()
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  
End

else if @TimeSpan='m'

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
and Tracking.TrackingDate between DATEADD(MONTH,-@Duration,GETDATE()) and GETDATE()
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  
End

else if @TimeSpan='y'

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
and Tracking.TrackingDate between DATEADD(YEAR,-@Duration,GETDATE()) and GETDATE()
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  
End

Else

begin
select (100*Count(distinct AssetId))/12 as TotalPercentage, TrackingStatusName from Tracking   
inner join TrackingStatus on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
Group by TrackingStatus.TrackingStatusName order by TotalPercentage DESC  

End

End

End 

所以我得到的结果是降序排列的。

在此处输入图片说明

我想显示查询的前6行。 如图所示,从第6行开始的前5行和第6行是所有总百分比的总和。

因此,在第五行之后,如何将行合并为一行并显示为另一行?

由于从第6条记录开始的Status字段值以单词“ status”开头,因此您可以对SQL块中的第6条/最后一条查询使用以下语句,这将为您提供1行,将所有“ status”状态的TotalPercentages相加行。

begin
    select (100*Count(distinct AssetId))/12 as TotalPercentage
          ,SUBSTRING(UPPER(TrackingStatusName), 1, 6) 
      from Tracking   
     inner 
      join TrackingStatus 
        on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
     where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
     Group 
        by SUBSTRING(UPPER(TrackingStatus.TrackingStatusName), 1, 6) 
     order 
        by TotalPercentage DESC  

End

作为对评论的回应,下面更新的SQL应该有效,应该将“ Others”作为最后一个SQL的第二列

begin
    select (100*Count(distinct AssetId))/12 as TotalPercentage
          ,SUBSTRING(STUFF(TrackingStatusName, PATINDEX('%______%', TrackingStatusName), 6, 'Others'), 1, 6) 
      from Tracking   
     inner 
      join TrackingStatus 
        on TrackingStatus.TrackingStatusId=Tracking.TrackingStatusId   
     where Tracking.IsDeleted=0 and TrackingStatus.IsDeleted=0 
     Group 
        by SUBSTRING(STUFF(TrackingStatusName, PATINDEX('%______%', TrackingStatusName), 6, 'Others'), 1, 6) 
     order 
        by TotalPercentage DESC  

End

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM