2016-11-10 2 views
-3

Ребята, есть ли у вас какие-либо идеи, как решить эту проблему?SELECT один из нескольких строк на основе переменной

Я ударил кирпичную стену. Я пишу код за отчет. Отчет должен показывать Colour на основе переменной FinancialYear.

Вот пример таблицы:

Table

CompanyID | StartDate | EndDate | ReviewDate | FinancialYear | Colour 
     46 | 2012-01-18 | 2013-12-17 | 2013-12-15 | 2012   | Red 
     46 | 2013-12-17 | 1900-01-01 | 2017-03-10 | 2014   | Red 
     46 | 2011-05-11 | 2012-01-17 | 2011-06-30 | 2014   | Orange 

Когда переменная FinancialYear будет 2016, CompanyID должен показать, как Colour RedEndDate является '' результат должен показать строку nnumber 2.

Однако, если FinancialYear переменная будет 2012 у меня есть две строки, которые будут соответствовать критериям, и нужно будет выбрать тот, который больше EndDate или StartDate, Reviewdate. В результате должен отображаться номер строки 1.

У кого-нибудь есть идея, как это сделать? Спасибо за любую обратную связь!

То, что я пытался до сих пор:

SELECT 
    CompanyID 
, StartDate AS [Traffic Lights Start Date] 
, EndDate AS [Traffic Lights End Date] 
, ReviewDate AS [Traffic Lights Review Date] 
, Category AS [Traffic Lights Colour] 
, CASE 
     WHEN (YEAR(EndDate) <> 1900 
      AND @FinancialYear BETWEEN (YEAR(DATEADD(DD,0, DATEDIFF(DD,0,  DATEADD(MM, -(((12 + DATEPART(M, CAST(StartDate AS DATETIME))) - 7)%12),  CAST(StartDate AS DATETIME))))) +1) 
          AND (YEAR(DATEADD(DD,0, DATEDIFF(DD,0, DATEADD(MM, -(((12 + DATEPART(M, CAST(EndDate AS DATETIME))) - 7)%12), CAST(EndDate AS DATETIME))))) +1) 
     AND (YEAR(DATEADD(DD,0, DATEDIFF(DD,0, DATEADD(MM, -(((12 + DATEPART(M, CAST(ReviewDate AS DATETIME))) - 7)%12), CAST(ReviewDate AS DATETIME)))))+1) >= @FinancialYear) 
      THEN '1' 
      WHEN 
       (YEAR(EndDate) = 1900 
      AND YEAR(ReviewDate) > = @FinancialYear) 
      THEN '1' 
     ELSE '0' 
    END AS FinancialYear_TrafficLights 
, (YEAR(DATEADD(MONTH,-((DATEPART(MONTH,CAST(StartDate AS DATETIME)) +7) %12),CAST(StartDate AS DATETIME)))+1) AS Actual_Financial_Year 
, ROW_NUMBER() OVER(PARTITION BY Company ORDER BY StartDate ASC) AS LatestRow 
FROM 
    CompanyTrafficLightHistory 
+0

пожалуйста, добавить определение таблицы с помощью шоу создать таблицу. – e4c5

+0

Показать, что вы пробовали? Даже если он не работает, он показывает усилие и ваш ход мысли –

+0

Спасибо! :) Не знаю, как добавить код с форматированием SQL здесь, но я отредактировал свои вопросы с ним. – Tom

ответ

0

Если вы только после одной строки, то вы правы в том, что вам нужно, чтобы заказать набор данных, а затем select top 1. Вы можете изменить способ набора данных заказанный в пункте order by путем добавления или удаления полей и с помощью desc указать порядок нисходящую (по умолчанию по возрастанию):

declare @t table (CompanyID int 
        ,StartDate date 
        ,EndDate date 
        ,ReviewDate date 
        ,FinancialYear int 
        ,Colour nvarchar(50) 
        ); 
insert into @t values 
(46,'20120118','20131217','20131215',2012,'Red') 
,(46,'20131217','19000101','20170310',2014,'Red') 
,(46,'20110511','20120117','20110630',2014,'Orange'); 

declare @FinancialYear int = 2012; 

select top 1 * 
from @t 
where FinancialYear = @FinancialYear 
order by case when EndDate = '19000101' -- Because you want 1900-01-01 to be seen as 'most recent', 
       then '29990101'   -- you need to replace it with a value way into the future. 
       else EndDate 
       end desc; 
+0

Спасибо, за ваше время, Дэйв! :)) Отлично работает, однако, когда вы выбираете FY, чтобы быть 2016, на выходе должен отображаться цвет RED, поскольку строка EndDate пуста, 1900-01-01, поэтому EndDate не будет. Имеет ли это смысл? – Tom

+0

, где FinancialYear <= @FinancialYear сделал трюк :) Спасибо Дэйв! :) – Tom

Смежные вопросы