【问题标题】:How to get maxdate for all like entries MySQL如何获取所有类似条目 MySQL 的 maxdate
【发布时间】:2012-01-30 21:48:19
【问题描述】:

我问了这个问题并得到了 mysql 的一个很好的答案:How to assign date value to all returned mysql queries 但现在我需要在 MS SQL (SQL Server 2005) 中做同样的事情。需要注意的是,我有一个案例陈述似乎正在破坏事情。我有两个这样的查询:

select * from (select row_number()
  over (order by a.device ASC)
  AS rownum, a.device, staff, requestDate, m.maxDate, attribute = 
                 REPLACE((SELECT attribute AS [data()]
                 FROM deviceList
                 WHERE device = a.device
                 ORDER BY device FOR xml PATH('')), ' ',  ' ')
  FROM deviceList a
  INNER JOIN (SELECT device, MAX(requestDate) AS maxDate
                 FROM ASSIGNMENT GROUP BY device) m on m.device = a.device
  RIGHT JOIN Assignment
      ON (Assignment.device=a.device)
  GROUP BY a.device, staff, maxDate, requestDate, contract)
  AS B WHERE B.rownum > 0;





select * from (select row_number()
  over (order by a.device ASC)
  AS rownum, a.device, staff, requestDate, CONVERT(
    varchar, dateadd(year,
    (CASE
        WHEN contract = '10' THEN 1
        WHEN contract = '20' THEN 2
        WHEN contract = '30' THEN 3
        ELSE 3
        END), m.maxDate) 107) as myEndDate, attribute = 
                 REPLACE((SELECT attribute AS [data()]
                 FROM deviceList
                 WHERE device = a.device
                 ORDER BY device FOR xml PATH('')), ' ',  ' ')
  FROM deviceList a
  INNER JOIN (SELECT device, MAX(requestDate) AS maxDate
                 FROM ASSIGNMENT GROUP BY device) m on m.device = a.device
  RIGHT JOIN Assignment
      ON (Assignment.device=a.device)
  GROUP BY a.device, staff, myEndDate, requestDate, contract)
  AS B WHERE B.rownum > 0;                 

第一个语句效果很好,就像条目(具有相同“设备”标签的条目)具有正确的 endDate。但是,当我尝试根据案例陈述增加日期时,事情就会出错。日期增加但不相同。为什么case语句会破坏这种性质的东西?

更新: 如果我对一台设备有两个日期值:

2/1/2010
1/1/2010

合约 = 10

查询后的日期分别为:

2/1/2011
2/1/2012

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    您必须在GROUP BY 子句中使用整个CASE 语句。 SQL Server 不一定会在执行GROUP BY 之前处理SELECT 元素,因此无法使用在那里定义的别名。 (Longer explanation here)。

    SELECT * FROM (SELECT ROW_NUMBER()
      OVER (ORDER BY a.device ASC)
      AS rownum, a.device, staff, requestDate, CONVERT(
        varchar, dateadd(year,
        (CASE
            WHEN contract = '10' THEN 1
            WHEN contract = '20' THEN 2
            WHEN contract = '30' THEN 3
            ELSE 3
            END), m.maxDate) 107) as myEndDate, attribute = 
                     REPLACE((SELECT attribute AS [data()]
                     FROM deviceList
                     WHERE device = a.device
                     ORDER BY device FOR xml PATH('')), ' ',  ' ')
      FROM deviceList a
      INNER JOIN (SELECT device, MAX(requestDate) AS maxDate
                     FROM ASSIGNMENT GROUP BY device) m on m.device = a.device
      RIGHT JOIN Assignment
          ON (Assignment.device=a.device)
      GROUP BY a.device, staff, CONVERT(
        varchar, dateadd(year,
        (CASE
            WHEN contract = '10' THEN 1
            WHEN contract = '20' THEN 2
            WHEN contract = '30' THEN 3
            ELSE 3
            END), m.maxDate) 107), requestDate, contract)
      AS B WHERE B.rownum > 0;            
    

    【讨论】:

    • 那行不通。它没有给出错误,但我仍然得到相同的结果。只是好奇,您是否在您的一个数据库上尝试过验证?看不到我可能做错了什么,因此我的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多