2011-04-14 165 views
0

的過濾表(代碼)可以有下列值查詢返回第二個值,如果有兩個,空,如果只是一個

code_type date    id   
TM  1/1/2011  2342 (random unique id) 
TM  2/1/2011  3298 (random unique id) 

表可能沒有TM記錄,一個TM記錄,或者它可能有兩個TM記錄(從未更多)。

如果只有一個值,我的輸出需要像這樣(空值或空值)。如果有兩條記錄,則會填寫code2和date2字段。如果沒有TM記錄,則所有字段都必須爲空或空。

code_type1 date1   code_type2  date2 
TM  1/1/2011  

我在select子句中的子查詢中這樣做,不確定是否會產生任何影響。我在想我需要一個CASE語句?

使用SQL Server 2008

編輯:代碼ID是隨機的,不一定是1或2,因爲我原本寫了這個

+1

我錯過了什麼嗎? 「code1/code2」在哪裏被拉出? (他們是否來自ID列?) – 2011-04-14 16:43:59

+0

我編輯了原始代碼表。 Code1/code2應該來自代碼表,列code_type。 – Gabe 2011-04-14 17:54:15

+2

那麼我的答案應該適合你。 – 2011-04-14 18:00:24

回答

1
WITH YourQuery(code,[date],id) As 
(
SELECT 'TM', '1/1/2011', 1 union all 
SELECT 'TM', '2/1/2011', 2 
), 
Numbered AS 
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) RN 
FROM YourQuery 
) 
SELECT 
    code1 = MAX(CASE WHEN RN=1 THEN code END), 
    date1 = MAX(CASE WHEN RN=1 THEN [date] END), 
    code2 = MAX(CASE WHEN RN=2 THEN code END), 
    date2 = MAX(CASE WHEN RN=2 THEN [date] END) 
FROM Numbered 
+0

謝謝你,馬丁!這很好。 – Gabe 2011-04-14 18:53:35

0
SELECT 
    code1 = (SELECT code FROM TABLENAME WHERE id = 1), 
    date1 = (SELECT [date] FROM TABLENAME WHERE id = 1), 
    code2 = (SELECT code FROM TABLENAME WHERE id = 2), 
    date2 = (SELECT [date] FROM TABLENAME WHERE id = 2) 

你可以用下面的腳本測試:

DECLARE @code TABLE (
code char(2), 
[date] char(30), 
id int) 

INSERT INTO @code (code, [date], id) VALUES ('TM', '1/1/2011', 1) 
INSERT INTO @code (code, [date], id) VALUES ('TM', '2/1/2011', 2) 

SELECT 
    code1 = (SELECT code FROM @code WHERE id = 1), 
    date1 = (SELECT [date] FROM @code WHERE id = 1), 
    code2 = (SELECT code FROM @code WHERE id = 2), 
    date2 = (SELECT [date] FROM @code WHERE id = 2) 
+0

@FreeAsInBeer:_建築批評會很好,而不是居高臨下。另外,如果你能更好地發佈你的版本。 – 2011-04-14 17:14:21

+1

如果刪除id = 1和id = 2的行,則查詢將返回所有空值。我很確定這個查詢不會'史詩般的失敗'。再次閱讀用戶的問題......我認爲你對這個問題的理解「史詩般的失敗」。 – lamarant 2011-04-14 17:32:53

+0

我對「問題的理解」是正確的。您應該*從不*寫出依賴於具有特定值的字段的查詢。這兩行都可以有任意的數字作爲一個id,因此你應該選擇所有的數據,而不用'WHERE'子句。 – FreeAsInBeer 2011-04-14 17:49:43

1

鑑於你的限制,永遠不會超過2條記錄,這是v只需使用標準SQL即可以跨平臺方式輕鬆完成;所有你需要的是一個LEFT JOIN

SELECT 
    Code1.Code_Type AS Code_Type1, 
    Code1.Date AS Date1, 
    Code2.Code_Type AS Code_Type2, 
    Code2.Date AS Date2 
FROM Code AS Code1 
LEFT JOIN Code AS Code2 
    ON (Code1.Code_Type = Code2.Code_Type) 
    AND (Code1.ID < Code2.ID) 
LEFT JOIN Code AS EarlierCode 
    ON (Code1.Code_Type = EarlierCode.Code_Type) 
    AND (Code1.ID > EarlierCode.ID) 
WHERE 
    (EarlierCode.ID IS NULL) 

這是假定'較低的ID'是確定哪一個是'code1'和哪個是'code2'的方法。如果是日期,則用JOIN的最後一行代替。

一個解釋,如果不清楚:你從表中的每一行開始(Code1)。然後您將表加入自身兩次:Code2表示任何具有較高ID的事物(根據您的預設,只有其中一個),EarlierCode代表較低的ID。因爲如果你有兩行,你不需要兩次(一次使用Code1中的較早值和Code2中的較早值,Code1Code2中的較後一值留空),那麼您就有'EarlierCode',它代表早於Code1。如果有一個,則將該行留出(WHERE子句)。

相關問題