是否可以查询 SQL 数据透视表并将输出加入另一个 select 语句?
Is it possible to query an SQL Pivot report and join the output in another select statement?
我在 SQL 中有一个数据透视表类型的报告(作为视图创建)。
工单编号为行,工单状态为列。
数据中的值是工单在该状态下花费的总时间的时间戳 (hh:mm: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;
查询视图(下方)我想添加(加入?)数据透视输出,并在顶部(列)添加状态名称以及 [=47= 中的值输出]
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
除了我的评论之外,您还可以让 Pivot 部分成为 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;
实际上,弄清楚这比我想象的要容易得多。
我所做的是将 select 语句和数据透视查询转换为单独的视图。之后,加入 select 视图,透视视图打开 ticket_number。它返回了与 select 语句票号内联的数据透视视图中的所有列。现场检查,一切顺利!
谢谢大家的帮助,不胜感激!
我在 SQL 中有一个数据透视表类型的报告(作为视图创建)。
工单编号为行,工单状态为列。
数据中的值是工单在该状态下花费的总时间的时间戳 (hh:mm: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;
查询视图(下方)我想添加(加入?)数据透视输出,并在顶部(列)添加状态名称以及 [=47= 中的值输出]
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
除了我的评论之外,您还可以让 Pivot 部分成为 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;
实际上,弄清楚这比我想象的要容易得多。
我所做的是将 select 语句和数据透视查询转换为单独的视图。之后,加入 select 视图,透视视图打开 ticket_number。它返回了与 select 语句票号内联的数据透视视图中的所有列。现场检查,一切顺利!
谢谢大家的帮助,不胜感激!