![](/img/trans.png)
[英]How to merge multiple rows into one row with filtering rules in SQL Server
[英]How to merge multiple rows into one row using stored procedure in sql server 2012?
三张桌子
我要制作“资产与状态对比图”表示在特定状态下有多少百分比的资产可用。
存储过程:
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.