2016-11-10 48 views
-3

夥計們你會有任何想法如何解決這個問題?根據變量從多行中選擇一個

我碰到了一堵磚牆。我正在編寫一份報告背後的代碼。報告必須根據FinancialYear變量顯示Colour

這裏是一個表例如:

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 

當可變FinancialYear2016CompanyID應顯示Colour Red作爲EndDate'' 結果應顯示行n已接收2

然而,如果FinancialYear變量爲2012我有將適合的標準和將需要選擇一個兩行更大EndDateStartDateReviewdate。 結果應顯示第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

請用show創建表添加您的表定義。 – e4c5

+0

顯示你已經嘗試過?即使它不工作,它也顯示努力和你的思路 –

+0

謝謝! :)不知道如何在這裏添加SQL格式的代碼,但我已經編輯了我的問題。 – Tom

回答

0

如果你只在一排後,那麼你是正確的,你需要訂購你的數據集,然後select top 1。您可以通過添加或刪除字段,並使用desc指定降序(缺省是升序)改變數據集的order by子句中的排序方式:

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

Where FinancialYear <= @FinancialYear訣竅:) 謝謝戴夫! :) – Tom