2016-07-28 30 views
0

我有一個項目的數據庫,它將每個可用的各種給定項目存儲在單獨的行上。僅僅通過項目名稱去,數據庫中的記錄是這樣的:試圖從數據庫中只返回一種類型的每個項目

10316-00-B 
10316-00-M 
10316-02-B 
10316-03-B 
10316-04-B 
10316-23-B 
10316-88-B 

...其中「10316」是實際的項目,然後一切都代表特定品種類型之後。我想編寫一個查詢,該查詢只返回項目「10316」(或其中任何一個)的一條記錄,以及所有其他表列中與該項目相關的信息,並忽略其餘部分。所以我會得到項目「10316-00-B」的記錄,但沒有其他記錄。這個過程將重複我的查詢返回的所有其他項目。

我不挑剔給定組的哪個項目被返回;最高的人會做。我只是看到10316,10317,10318及以後的每個列表,而不是每個項目和變體。

我試過DISTINCT left(columnName,5),但那不會根據需要篩選記錄。有誰知道如何做到這一點?我正在使用Sql Server 2008 R2。

更新:我試圖實施由@ mo2提供的解決方案 - 看起來這個是最有可能返回給定項目的所有數據,這是我想要的。不幸的是,我收到錯誤「沒有列名稱被指定爲't'的第1列」,我不知道如何解決這個問題。我對他的查詢的版本是這樣的:

SELECT * FROM (
    select left(item, 5), col1, col2, ... , row_number() 
    over (partition by LEFT(item, 5) order by item) rn 
    from Table  
) t 
where rn = 1 

最後更新:我標誌着@kbball答案的解決方案,但真正的信貸應該去@ MO2爲好。 @kbball的答案幫助我理解了@ mo2的答案。

回答

0

這是一個稍微簡單一些:

SELECT DISTINCT sub.item 
FROM (SELECT LEFT(columnName,5) AS item FROM Table) sub 
0

你會希望有具體的品種類型爲每個項目單獨,只是作爲一個數據庫設計一個通用的技術:

10316 | 00 |乙

然後你就可以查詢使用:

SELECT DISTINCT(item) 
FROM itemlist 
WHERE itemnum=10316; 

希望這有助於

1

鮮明,如果你只單獨找一列會工作。但是當你添加你需要的剩餘列時,它會被拋棄。你可以試試這個:

select * from (
    select 
    left(col1, 5) col1, 
    col2, 
    col3, 
    col4, 
    row_number() over (partition by left(col1, 5) order by col1) rn 
    from your_table 
) t 
where rn = 1 

你可以改變order by到不同的列,如日期/時間列,如果你想獲得每個項目的第一個或最後一個記錄。

+0

我想您的解決方案,但我不知道,「T」是應該做的是右括號之後。我收到錯誤「沒有爲't'的列1指定列名。」 – bmurrell30

+0

「t」只是我認爲sql服務器需要的子查詢的別名。您可以嘗試單獨運行子查詢來了解其工作原理。不知道爲什麼你看到查詢時發生錯誤。 – mo2

相關問題