几列的最大值(日期和成本关系)

时间:2010-01-03 04:03:52

标签: sql sql-server sql-server-2005 aggregate

如何返回多列的最大值(日期和费用关系)?

TableName [ID, Date1, Cost1, Date2, Cost2, Date3, Cost3]

我需要返回这样的内容:[ID,最近日期,费用]


我需要返回这样的内容:

  • ID
  • 最近日期
  • 与日期相关的成本(如果最近的日期是Date1,那么成本是Cost1)

我需要使用另一个表 - BackupTableName:

  • ID
  • 日期1
  • COST1
  • 日期2
  • Cost2
  • DATE3
  • Cost3

...并在TableName的Cost1,Cost2和Cost3为空时使用其'数据。

2 个答案:

答案 0 :(得分:2)

SELECT ID,
    CASE
        WHEN Date1>Date2 AND Date1>Date3 THEN Date1
        WHEN Date2>Date1 AND Date2>Date3 THEN Date2
        ELSE Date3
    END AS "Most Recent Date",
    CASE
        WHEN Date1>Date2 AND Date1>Date3 THEN Cost1
        WHEN Date2>Date1 AND Date2>Date3 THEN Cost2
        ELSE Cost3
    END AS Cost
FROM TableName;

'Date1'...'Date2'...'Date3'是一种架构气味。考虑规范化为单独的多对一表。

ETA:

  

在TableName的Cost1,Cost2和Cost3为空的情况下。

你也有空吗?好吧,这真的很不愉快。您需要防止空值,例如:

    CASE
        WHEN Date1>COALESCE(Date2, 0) AND Date1>COALESCE(Date3, 0) THEN Date1
        WHEN Date2>COALESCE(Date1, 0) AND Date2>COALESCE(Date3, 0) THEN Date2
        ELSE Date3
    END AS "Most Recent Date",

(在日期选择位和成本选择位中。这假设成本通常总是高于0。)

  

我需要使用另一个表:BackupTableName [ID,Date1,Cost1,Date2,Cost2,Date3,Cost3]并使用其数据

嗯......这是可能的,但你的模型现在看起来非常不稳定。

SELECT t0.ID,
    CASE
        WHEN t0.Date1>COALESCE(t0.Date2, 0) AND t0.Date1>COALESCE(t0.Date3, 0) THEN t0.Date1
        WHEN t0.Date2>COALESCE(t0.Date1, 0) AND t0.Date2>COALESCE(t0.Date3, 0) THEN t0.Date2
        WHEN t0.Date3>COALESCE(t0.Date1, 0) AND t0.Date3>COALESCE(t0.Date1, 0) THEN t0.Date3
        WHEN t1.Date1>COALESCE(t1.Date2, 0) AND t1.Date1>COALESCE(t1.Date3, 0) THEN t1.Date1
        WHEN t1.Date2>COALESCE(t1.Date1, 0) AND t1.Date2>COALESCE(t1.Date3, 0) THEN t1.Date2
        WHEN t1.Date3>COALESCE(t1.Date1, 0) AND t1.Date3>COALESCE(t1.Date1, 0) THEN t1.Date3
    END AS "Most Recent Date",
    -- the same thing all over again for the cost selector
FROM TableName AS t0
LEFT JOIN BackupTableName AS t1 ON t0.ID=t1.ID;

如果它完全在您的权力范围内,您需要normalise这些表,因为您目前拥有的数据模型基本上已被破坏。

答案 1 :(得分:0)

如果您的数据库支持,您可以使用greatest功能

select ID, greatest(Date1, Date2, Date3) as recent_date, 
           greatest(Cost1, Cost2, Cost3) as priceless from Table