Как получить maxdate для всех похожих записей MySQL - PullRequest
1 голос
/ 31 января 2012

Я задал этот вопрос и получил отличный ответ для mysql: Как назначить значение даты для всех возвращаемых запросов mysql , но теперь мне нужно сделать то же самое в 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

1 Ответ

0 голосов
/ 31 января 2012

Вы должны будете использовать весь оператор CASE в предложении GROUP BY. SQL Server не обязательно обрабатывает элементы SELECT до выполнения GROUP BY, поэтому определенные здесь псевдонимы использовать нельзя. ( Более подробное объяснение здесь ).

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;            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...