2017-05-15 17 views
0

某些數據我的數據是這樣的:移調只有在SQL

Company Year   Total Comment     
Comp A 01-01-2000 5,000 Checked 
Comp A 01-01-2001 6,000 Checked 
Comp B 05-05-2007 3,000 Not checked completely 
Comp B 05-05-2008 4,000 Checked 
Comp C 18-01-2003 1,500 Not checked completely 
Comp C 18-01-2002 3,500 Not checked completely 

我一直要求調換某些數據,但我不認爲這可以通過使用SQL(服務器),使得它看起來完成像這樣:

Company  Base Date Base Date-1 Comment Base Date  Comment Base Date-1 
Comp A  01-01-2001 01-01-2000 Checked    Checked 
Comp B  05-05-2008 05-05-2007 Checked    Not completely checked 
Comp C  18-01-2003 18-01-2002 Not completely checked Not completely checked 

我從來沒有建立過這樣的東西。如果我願意,那麼Excel可能是一個更好的選擇?我應該如何解決這個問題?

是否有可能使用SELECT MAX(基準日期)和MIN(基準日期)?然後,我將如何解決這樣的字符串..

+1

這是什麼邏輯? –

+0

這就是他們想要的。它是基於某些信息。所以想象一家公司,然後2年他們檢查了某些事情。他們只需要一行,而不是多行 – Probs

+0

來實現這一點,您需要一個額外的字段,告訴您如何分組記錄。 –

回答

0

我會爲公司按照年份排序的每個記錄分配一個行號,儘管公用表表達式中的分析函數...然後在行號+ 1和公司使用左自聯接... 。

這裏假設您只需要每個公司使用最近2年的記錄。如果公司只有一條記錄存在,則第二年可以接受空值。如果沒有,我們可以將左連接更改爲內部並消除兩個記錄...

我們使用公用表表達式(儘管內聯視圖也可以)來爲每條記錄分配一個行號。該值隨後在我們的自我加入中可用,因此我們不必擔心不同的日期和最大值。然後我們使用我們的RowNumber(RN)和公司將所需的2個記錄一起加入。爲了我們限制1分表至RN和第二臺節省一些性能,以RN 2

WITH CTE AS (
SELECT *, Row_Number() over (Partition by Company Order by Year Desc) RN FROM TABLE) 

SELECT A.Company 
    , A.Year as Base_Date 
    , B.Year as Base_Date1 
    , A.comment as Base_Date_Comment 
    , B.Comment as Base_Date1_Comment 
FROM CTE A 
LEFT JOIN CTE B 
    on A.RN+1 = B.RN 
and A.Company = B.Company 
and B.RN = 2 
WHERE A.RN = 1 

注意對RN極限= 2必須在加入,因爲它是一個外連接,否則我們將消除公司沒有2年。 (實質上使左連接成爲內部)

該方法使得每行的數據的所有列都可用。

+0

完美!謝謝 :) – Probs

1

您可以使用self join來做到這一點。但是,你應該考慮像2月29日這樣的日期,因爲它們只發生在閏年。

select t1.company,t1.year as basedate,t2.year as basedate_1, 
t1.comment as comment_basedate,t2.comment as comment_basedate_1 
from t t1 
left join t t2 on t1.company=t2.company dateadd(year,1,t2.year)=t1.year 

更改left joininner join,如果你只在一家公司都存在的日期值的結果。該解決方案假定每天只能有一條評論。

+0

根據他的例子,您應該只需要加入公司和年。 –

+0

非常感謝您的幫助!這確實很有意義:) – Probs

0

如果每個只有兩行,那麼這很簡單。如果有超過兩行,你可以做這樣的事情 - 基本上連接所有行,然後確保A代表最早的行,B代表最新的行。

SELECT A.Company, A.Year AS [Base Date], B.Year AS [Base Date 1], 
     A.Comment AS [Comment Base Date], B.Comment AS [Comment Base Date 1] 
FROM MyTable A 
    INNER JOIN MyTable B ON A.Company = B.Company 
WHERE A.Year = (SELECT MIN(C.YEAR) FROM MyTable C WHERE C.Company = A.Company) 
    AND B.Year = (SELECT MAX(C.YEAR) FROM MyTable C WHERE C.Company = B.Company) 

有可能是一種更有效的方法來做到這一點與Row_Number或什麼。

+0

非常感謝您的幫助! – Probs