从SQL / SSRS 2005中的每一行中选择最大日期的列名

时间:2013-02-18 19:39:18

标签: sql sql-server-2005 reporting-services reportingservices-2005

如何将最右边的“上一步”列添加到SSRS中的报告中?基本上,我需要包含该行最新日期的列的名称。实际数据将是几千行,每行约有15个日期。

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包含简单的示例数据。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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