需要为单个列显示多列信息

时间:2016-12-02 20:02:33

标签: sql sql-server

我的表中有一个历史记录条目,它提供有关故障单的信息,如升级级别,分配给级别,状态。所有这些信息都在特定故障单的历史记录字段中。我需要为partiuclar票证显示多列历史信息。就像展示门票一样,包含历史信息,例如" Esclataed to Level 2"在一列中,然后"状态从关闭变为已解决"在不同的列等等。基本上取决于我提供的条件,我想显示不同的列。

以下是我的代码:

Declare @Top  int = null             --<<  Sets top of Hier Try 12
Declare @Nest varchar(25) ='|-----'  --<<  Optional: Added for readability

;with cteHB (Seq,Path,PROBLEM_TYPE_ID,PARENT_ID,Lvl,PROBLEM_TYPE_NAME) as (
    Select  Seq  = cast(1000+Row_Number() over (Order by PROBLEM_TYPE_NAME) as varchar(500))
           ,Path = cast(PROBLEM_TYPE_ID as varchar(500))
           ,PROBLEM_TYPE_ID
           ,PARENT_ID
           ,Lvl=1
           ,PROBLEM_TYPE_NAME 
     From   problem_type 
     Where  IsNull(@Top,-1) = case when @Top is null then isnull(PARENT_ID,-1) else PROBLEM_TYPE_ID end
     Union  All
     Select Seq  = cast(concat(cteHB.Seq,'.',1000+Row_Number() over (Order by cteCD.PROBLEM_TYPE_NAME)) as varchar(500))
           ,Path = cast(concat(cteHB.Path,'.',cteCD.PROBLEM_TYPE_ID) as varchar(500))
           ,cteCD.PROBLEM_TYPE_ID
           ,cteCD.PARENT_ID,cteHB.Lvl+1
           ,cteCD.PROBLEM_TYPE_NAME 
     From   problem_type cteCD 
     Join   cteHB on cteCD.PARENT_ID = cteHB.PROBLEM_TYPE_ID)
    ,cteR1 as (Select Seq,PROBLEM_TYPE_ID,R1=Row_Number() over (Order By Seq) From cteHB)
    ,cteR2 as (Select A.Seq,A.PROBLEM_TYPE_ID,R2=Max(B.R1) From cteR1 A Join cteR1 B on (B.Seq like A.Seq+'%') Group By A.Seq,A.PROBLEM_TYPE_ID )
    ,cteFinalHier as (
        Select B.R1  
              ,C.R2
              ,A.PROBLEM_TYPE_ID
              ,A.PARENT_ID
              ,A.Lvl
              ,PROBLEM_TYPE_NAME = Replicate(@Nest,A.Lvl-1) + A.PROBLEM_TYPE_NAME
              ,A.Seq                                      -- < Included for Illustration
              ,A.Path                                     -- < Included for Illustration
         From cteHB A
         Join cteR1 B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID
         Join cteR2 C on A.PROBLEM_TYPE_ID=C.PROBLEM_TYPE_ID
    )
Select A.Job_ticket_id
      ,[Problem_Type_Name(Parent)]=C.PROBLEM_TYPE_NAME
      ,[Problem_Type_Name(Child)] =B.PROBLEM_TYPE_NAME
      ,B.PROBLEM_TYPE_ID
      ,custom1.string_value
      ,HISTORY_ENTRY.ENTRY_DATE
      ,HISTORY_ENTRY.ENTRY_TEXT
    ,A.Report_Date
      ,A.LAST_UPDATED
      ,a.STATUS_TYPE_ID AS 'Ticket_Status'
      ,A.Close_Date
      ,A.TECH_GROUP_ID
       ,A.ASSIGNED_TECH_ID
      ,TECH_GROUP_LEVEL.LEVEL_NUMBER
      ,PRIORITY_TYPE_NAME
      ,TECH_GROUP.NAME
      ,DATEDIFF(MINute, A.REPORT_DATE,A.FIRST_RESPONSE_DATE) as 'time_to_accept'                   
      , DATEDIFF(MINUTE,A.[FIRST_RESPONSE_DATE],A.[CLOSE_DATE]) as 'time_to_resolve'

      -----------------------only for tickets open older than 72 hours------------------------------
      ,DATEDIFF(MINUTE,a.LAST_UPDATED,getdate()) as 'Time_after_Update'
      ------------------------------------------------------------------------------------------------
      ,case WHEN DATEDIFF(MINute, A.REPORT_DATE,A.FIRST_RESPONSE_DATE) <= 10                        -- < for tickets accepted withiin 10 miniutes and resolved within their priority level minutes
                and DATEDIFF(MINUTE,A.[FIRST_RESPONSE_DATE],A.[CLOSE_DATE]) <= case PRIORITY_TYPE_NAME
                                   WHEN 'low' then 960
                                   WHEN 'medium' then 480
                                   WHEN 'high' then 120
                                   WHEN 'Urgent' then 60
                                   end
  then 1
  else 0
  end
  AS [SLA Compliant]
  ,CAST ((sum(case WHEN DATEDIFF(MINute, A.REPORT_DATE,A.FIRST_RESPONSE_DATE) <= 10                     -- < for tickets accepted withiin 10 miniutes and resolved within their priority level minutes
                and DATEDIFF(MINUTE,A.[FIRST_RESPONSE_DATE],A.[CLOSE_DATE]) <= case PRIORITY_TYPE_NAME
                                   WHEN 'low' then 960
                                   WHEN 'medium' then 480
                                   WHEN 'high' then 120
                                   WHEN 'Urgent' then 60
                                   end
  then 1
  else 0
  end)*100.0)/COUNT(*) as money) as Percent_Compliant
  ------------------------------JOINS--------------------------------------------------                                                                                 
 From  JOB_TICKET A
 Join  cteFinalHier B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID

 INNER JOIN [SWHD01].[dbo].[PRIORITY_TYPE] ON A.[PRIORITY_TYPE_ID] = [PRIORITY_TYPE].[PRIORITY_TYPE_ID]

 INNER JOIN [SWHD01].[dbo].[STATUS_TYPE] ON A.[STATUS_TYPE_ID] = [STATUS_TYPE].[STATUS_TYPE_ID]

  inner join [SWHD01].[dbo].TECH_GROUP_LEVEL on A.TECH_GROUP_LEVEL_ID=TECH_GROUP_LEVEL.ID

 join TECH_GROUP on TECH_GROUP.ID= TECH_GROUP_LEVEL.tech_group_id

 join ticket_custom_field custom1 on custom1.entity_id = a.job_ticket_id
join custom_field_definition custom_definition1 on custom_definition1.id=custom1.definition_id and custom_definition1.label='severity'

join HISTORY_ENTRY on a.JOB_TICKET_ID=HISTORY_ENTRY.JOB_TICKET_ID



 Cross Apply (Select Top 1 * from cteFinalHier Where B.R1 between R1 and R2 and Lvl=1) C

 -------------Tickets for the Last 6 months---------------------------------------------------

 where datediff(MONTH, A.REPORT_DATE, getdate()) <= 6
and TECH_GROUP.NAME like '%NOC%'
 and LEVEL_NUMBER ='2'
 and HISTORY_ENTRY.ENTRY_TEXT  like '%Assigned to %Level 2%%'

--------------------------------------------------------------------------
 Group By C.PROBLEM_TYPE_NAME,a.JOB_TICKET_ID,B.PROBLEM_TYPE_NAME,B.PROBLEM_TYPE_ID, a.REPORT_DATE,a.CLOSE_DATE,SWHD01.dbo.PRIORITY_TYPE.PRIORITY_TYPE_NAME,a.FIRST_RESPONSE_DATE,B.R1,a.LAST_UPDATED,a.STATUS_TYPE_ID,a.TECH_GROUP_ID,TECH_GROUP_LEVEL.LEVEL_NUMBER,TECH_GROUP.NAME,a.ASSIGNED_TECH_ID,custom1.STRING_VALUE,HISTORY_ENTRY.ENTRY_DATE,HISTORY_ENTRY.ENTRY_TEXT
 Order By B.R1

目前的输出是: enter image description here

预期产量为: enter image description here

1 个答案:

答案 0 :(得分:0)

根据评论进行更新

这正是我的例子向您展示的方法:

self

你是否看到这与我原来的答案是一致的,如果你没有提供任何明确的细节,那么答案必须是一般性的。

原始回答

所以......你想知道怎么做?

self