简体   繁体   English

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

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

There are three tables 三张桌子

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

I want to make Graph of Asset Vs Status means How many percentage Assets are available in particular status. 我要制作“资产与状态对比图”表示在特定状态下有多少百分比的资产可用。

Stored Procedure : 存储过程:

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 

So I am getting result in descending order. 所以我得到的结果是降序排列的。

在此处输入图片说明

I want to display first 6 rows from query. 我想显示查询的前6行。 First 5 rows as it is and 6 row is sum of all Total Percentage starting from 6th row as shown in figure. 如图所示,从第6行开始的前5行和第6行是所有总百分比的总和。

So after fifth row, How to merge rows into one row and display as others??? 因此,在第五行之后,如何将行合并为一行并显示为另一行?

Since the Status field value from the 6th record onwards starts with the word "status", you can use the following statement for your 6th/last query in your SQL block and that should give you 1 row that adds up the TotalPercentages for all "status" rows. 由于从第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

In response to the comment, the below updated SQL should work, it should 'Others' as the second column for the last SQL 作为对评论的回应,下面更新的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