2015-09-12 24 views
0

我有一个在SQL中的透视类型报告(作为视图创建)。是否可以查询SQL数据透视报表并在另一个select语句中加入输出?

票号是ROWS,而票状态是COLUMNS。

在数据的值是时间戳的总时间的车票是处于该状态的花费(HH:SS:毫米)。 SQL枢轴视图的

样品(注:所有的状态都没有列出(见所有 SQL支点查询):

ticket_number closed completed new  waiting-1 
22    0:00:00 0:00:00  0:00:00 0:00:00 
32    0:00:00 0:00:00  6:00:01 0:00:00 

SQL枢轴查询:

v_pivottime

WITH t AS (
    select 
     ticket_number, 
     ISNULL(status,'null') status, 
     update_date, 
     row_number() OVER (PARTITION BY ticket_number ORDER BY update_date) rn 
    from xxx.dbo.report 
), s AS (
    SELECT 
     t1.ticket_number, 
     t1.status, 
     t1.update_date, 
     t2.update_date prevdate, 
     case when t2.status=t1.status then DATEDIFF(s, t2.update_date, t1.update_date) end dif 
    FROM t t1 
    LEFT JOIN t t2 ON t1.ticket_number=t2.ticket_number AND t1.rn=t2.rn+1 
) 
SELECT * 
FROM (
    SELECT 
     ticket_number, 
     [status], 
     cast(dateadd(s,sum(dif),0) as time(0)) [time] 
    FROM s 
    GROUP BY ticket_number,status) src 
PIVOT 
(
    min([time]) 
    for [status] in ([Closed], [Complete], [New], [Waiting-1], [Waiting-2], [Waiting-3], [stoptime], [Research-1], [Research-2], [Resolved], [Special Request], [Opened Request], [null]) 
) piv; 

所查询视图(下)我想补充(加入?)枢轴输出,和在顶部添加状态名称(列),以及在HH输出的值:mm:ss的

v_last_update

select 
     ctr1.ticket_number, 
     ctr1.status, 
     ctr1.create_date, 
     ctr1.created_by, 
     ctr1.customer, 
     ctr1.description, 
     ctr1.update_sequence, 
     ctr1.update_date   
FROM  
     xx.dbo.report ctr1 
JOIN (
       select ticket_number as ticket_number_d, 
       MAX(update_date) as max_update_date, 
       MAX(update_sequence) as max_ update_sequence 
       from xx.dbo.report 
       group by ticket_number 
     ) ctr2 

ON  ctr1.ticket_number = ctr2.ticket_number_d 
AND  ctr1.update_date = ctr2.max_update_date 
AND  ctr1.update_sequence = ctr2.max_update_sequence 
WHERE customer <> ‘Bread’ 
ORDER BY max_update_date ASC; 

*想看看是否有一种方法,我可以稍微执行从v_last_update查询准考证号码一个VLOOKUP的交易类型,并添加列到输出列的结束。希望为每个状态添加一列,并插入该票证状态的时间。这可能会让我疯狂!

谢谢!

-P

+0

假设,即所有的疑问按预期投放,只需要创建一个视图或(直列!) - TVF从支点查询,并加入它,如果它是一个表... – Shnugo

回答

1

除了我的评论,你可以让枢轴部分是CTE还有:

(未经测试)

WITH t AS (
    select 
     ticket_number, 
     ISNULL(status,'null') status, 
     update_date, 
     row_number() OVER (PARTITION BY ticket_number ORDER BY update_date) rn 
    from xxx.dbo.report 
), s AS (
    SELECT 
     t1.ticket_number, 
     t1.status, 
     t1.update_date, 
     t2.update_date prevdate, 
     case when t2.status=t1.status then DATEDIFF(s, t2.update_date, t1.update_date) end dif 
    FROM t t1 
    LEFT JOIN t t2 ON t1.ticket_number=t2.ticket_number AND t1.rn=t2.rn+1 
) 
,pivotPart AS 
(
    SELECT * 
    FROM (
     SELECT 
      ticket_number, 
      [status], 
      cast(dateadd(s,sum(dif),0) as time(0)) [time] 
     FROM s 
     GROUP BY ticket_number,status) src 
    PIVOT 
    (
     min([time]) 
     for [status] in ([Closed], [Complete], [New], [Waiting-1], [Waiting-2], [Waiting-3], [stoptime], [Research-1], [Research-2], [Resolved], [Special Request], [Opened Request], [null]) 
    ) piv 
) 
select 
     ctr1.ticket_number, 
     ctr1.status, 
     ctr1.create_date, 
     ctr1.created_by, 
     ctr1.customer, 
     ctr1.description, 
     ctr1.update_sequence, 
     ctr1.update_date, 
     pivotPart.*   
FROM  
     xx.dbo.report ctr1 
JOIN pivotPart ON ctr1.ticket_number=pivotPart.ticket_number 
JOIN (
       select ticket_number as ticket_number_d, 
       MAX(update_date) as max_update_date, 
       MAX(update_sequence) as max_ update_sequence 
       from xx.dbo.report 
       group by ticket_number 
     ) ctr2 

ON  ctr1.ticket_number = ctr2.ticket_number_d 
AND  ctr1.update_date = ctr2.max_update_date 
AND  ctr1.update_sequence = ctr2.max_update_sequence 
WHERE customer <> ‘Bread’ 
ORDER BY max_update_date ASC; 
+0

谢谢Shungo!该查询可以工作,但没有列显示数据透视 – Panthersfball234

+0

@ Panthersfball234的时间戳,在“pivotPart”中选择了ticket_number,状态和时间,在上面用“SELECT *”选择这些三个......不知道你需要什么其他信息......顺便说一句:如果你想拥有多于一列的支点,它会变得非常棘手。请投票和/或标记为接受,如果有帮助或继续询问... – Shnugo

0

其实,想通了这是比较容易的方式比我想象的要多。

我所做的是将选择语句和数据透视查询转换为单独的视图。之后,加入选择视图与枢轴视图ON ticket_number。它以内联的select语句票号返回了枢轴视图中的所有列。现场检查和它的点!

谢谢大家的帮助,非常感谢!

+1

因为这是我的意见和我的回答,它带来了你在正确的道路上,这将是非常好的你upvote我的答案和/或标记为接受,thx! – Shnugo

+0

完成:)再次感谢你 – Panthersfball234

相关问题