Как выбрать значения из разных строк в зависимости от самой последней даты ввода, все для одного и того же идентификатора сотрудника? - PullRequest
0 голосов
/ 20 апреля 2010

В основном у меня есть таблица, в которой хранятся детали рабочей одежды сотрудников. Формируется из столбцов:

EmployeeID, CostCentre, AssociateLevel, IssueDate, TrouserSize, TrouserLength, TopSize & ShoeSize. 

Сотруднику может быть назначена пара брюк, топ и обувь одновременно или только один или два предмета одежды. Как мы все знаем, размеры людей и уровни сотрудников могут меняться, поэтому мне действительно нужна помощь. Разные типы сотрудников (ассоциированные уровни) требуют разных цветов одежды, но вы можете игнорировать эту часть. Каждый раз, когда сотрудник получает предмет одежды, новая строка будет вставлена ​​в таблицу с вводимой датой. Мне нужно иметь возможность выбрать самый последний размер одежды для каждого предмета одежды для каждого сотрудника.

Не обязательно, чтобы во всех столбцах содержались значения, потому что служащий мог получать брюки или рубашки в разное время года.

Так, например, если сотруднику «54664LSS» дали 24 брюк «XL» и майку «L» 24/03/11, но затем 26 мая 2010 года он получил топ «М». Ввод этих элементов будет помогать в двух разных строках. Так что, если бы я хотел выбрать самую последнюю одежду для каждой категории одежды. Тогда нужно будет вернуть значения верхней части размера «M» и брюк размера «L».

Любая помощь будет принята с благодарностью :(. Спасибо.

Ответы [ 2 ]

1 голос
/ 20 апреля 2010
SELECT TOP 1
  TrouserSize, AssociateLevel
FROM 
  Employee
WHERE
  EmployeeID = '54664LSS' AND
  TrouserSize IS NOT NULL
ORDER BY 
  IssueDate DESC

SELECT TOP 1
  TopSize, AssociateLevel
FROM 
  Employee
WHERE
  EmployeeID = '54664LSS' AND
  TopSize IS NOT NULL
ORDER BY 
  IssueDate DESC

(Извините, я редактировал этот sql около 6 раз, пока не нашел ответ, который я думаю)

Допущения - есть только один столбец даты выпуска. На дату выпуска может быть выпущено более одного элемента, но вам не нужно видеть эти результаты вместе (в противном случае нам придется сгруппировать объединенные результаты). Если элемент не был выпущен, в столбец помещается ноль.

Не уверен, какой будет ваша логика, если AssociateLevel меняется между проблемами с одеждой

0 голосов
/ 21 апреля 2010

Всегда легче ответить, если вы можете дать определение схемы и некоторые примеры данных и ожидаемый результат, а не комментарий. Я попытался определить схему, у меня нет примеров данных и думаю , что этот ответ дает то, что вы хотите:

/*create table Clothing (
 EmployeeID int not null,
 CostCentre varchar(10) not null,
 AssociateLevel int not null,
 IssueDate datetime not null,
 TrouserSize int null,
 TrouserLength int null,
 TopSize varchar(4) null,
 ShoeSize varchar(10) null
)*/
go
with Trousers as (
 select
  EmployeeID,
  CostCentre,
  AssociateLevel,
  IssueDate,
  TrouserSize,
  TrouserLength,
  RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
 from
  Clothing
 where
  TrouserSize is not null
), Tops as (
 select
  EmployeeID,
  CostCentre,
  AssociateLevel,
  IssueDate,
  TopSize,
  RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
 from
  Clothing
 where
  TopSize is not null
), Shoes as (
 select
  EmployeeID,
  CostCentre,
  AssociateLevel,
  IssueDate,
  ShoeSize,
  RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
 from
  Clothing
 where
  ShoeSize is not null
)
select
  COALESCE(tr.EmployeeID,tops.EmployeeID,sh.EmployeeID) as EmployeeID,
  tr.CostCentre,
  tr.AssociateLevel,
  tr.IssueDate,
  tr.TrouserSize,
  tr.TrouserLength,
  tops.CostCentre,
  tops.AssociateLevel,
  tops.IssueDate,
  tops.TopSize,
  sh.CostCentre,
  sh.AssociateLevel,
  sh.IssueDate,
  sh.ShoeSize
from
 Trousers tr
  full outer join
 Tops
  on
   tr.EmployeeID = Tops.EmployeeID
  full outer join
 Shoes sh
  on
   tr.EmployeeID = sh.EmployeeID and
   Tops.EmployeeID = sh.EmployeeID
where
 (tr.RowNum is null or tr.RowNUm = 1) and
 (Tops.RowNum is null or Tops.RowNUm = 1) and
 (sh.RowNum is null or sh.RowNum = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...