2

如何將最右側的「最後一步」列添加到SSRS中的報表中?實質上,我需要包含該行最近日期的列的名稱。實際數據將有幾千行,每行約15個日期。從SQL/SSRS 2005中的每一行中選擇最大日期的列名稱

Name  Step X  Step W  Step A  Step B  Step Y  Last Step 
------------------------------------------------------------------------------- 
John  1/21/2013 1/24/2013 1/3/2013 1/27/2013 1/7/2013 Step B 
Sally  1/22/2013 1/24/2013 1/12/2013 1/1/2013 1/5/2013 Step W 

SQL Fiddle與簡單的示例數據。

回答

1

這是通過修改您的first question中的查詢來完成此操作的另一種方法。這只是增加了name到結果,所以你可以得到max(date)每個名稱:

;with cte as 
(
    select name, col, value 
    from yourtable 
    unpivot 
    (
    value 
    for col in ([Step X], [Step W], [Step A], [Step B], [Step Y]) 
) unpiv 
) 
select t.name, 
    [Step X], 
    [Step W], 
    [Step A], 
    [Step B], 
    [Step Y], 
    d.col LastStep 
from yourtable t 
cross apply 
(
    select c1.col 
    from cte c1 
    inner join 
    (
    select name, max(value) MaxDate 
    from cte 
    group by name 
) c2 
    on c1.value = c2.maxdate 
    and c1.name = c2.name 
    where t.name = c1.name 
) d 

SQL Fiddle with Demo

1

這裏是不使用動態SQL(因爲這是報告服務)的方式:

SELECT T.*, C.ColName 
FROM yourtable T 
OUTER APPLY (SELECT TOP 1 * 
      FROM (SELECT 'Step X', [Step X] 
        UNION ALL 
        SELECT 'Step W', [Step W] 
        UNION ALL 
        SELECT 'Step A', [Step A] 
        UNION ALL 
        SELECT 'Step B', [Step B] 
        UNION ALL 
        SELECT 'Step Y', [Step Y]) X(ColName,ColValue) 
      ORDER BY ColValue DESC) C 

the fiddle

+0

按預期工作,謝謝! – Kon 2013-02-18 21:29:43

0

對於後人的緣故,這裏是bluefeet對類似問題的解答的修改版本,以及the fiddle

WITH cte AS (
    SELECT *, Rank() OVER (PARTITION BY Name ORDER BY value DESC) AS Rank 
    FROM (
     SELECT * 
     from yourtable 
     unpivot 
     (
     value 
     for col in ([Step X], [Step W], [Step A], [Step B], [Step Y]) 
    ) unpiv 
    ) X 
) 
SELECT yt.[Step X] 
     , yt.[Step W] 
     , yt.[Step A] 
     , yt.[Step B] 
     , yt.[Step Y] 
     , c1.col 
FROM yourtable yt 
JOIN cte c1 
ON yt.Name = c1.Name 
AND c1.Rank = 1 
相關問題