2016-05-10 67 views
1

我正在嘗試解決SQL中的查詢以從輔助表中選擇記錄,這是基於對許多字段之一的答案。特定的字段因記錄而異,所以我需要使用我的初始查詢中的VALUE作爲輔助查詢中的COLUMN標題。使用一個字段的值作爲子查詢中的列名稱

我有三個表(簡化本示例)

通行證表:

PassID | PassType | PersonID | 
1  | 3   | 54  | 
2  | 4   | 59  | 

資格所需的表:

PassType | QualificationField | QualificationAnswer 
3   | Q8     | Yes 
4   | Q3     | All 

人表:

PersonID | Name |...| Q3 |...| Q8 
54  | John |...| Non |...| No 
59  | Jane |...| ALL |...| No 

埃森特不同的通行證有不同的標準,使他們有資格獲得額外的......我需要確定的是每個人,如果他們具有基於他們被分配的通行證的資格標準。

這些表實際上是一個更大的系統的一部分,人表中的列可以在數據庫的不同迭代中動態添加,所以我不能顯着更改表結構 - 我需要能夠提取我的在SQL查詢中回答以確定哪些人有資格獲得這個「額外的東西」。

我已經有一個查詢(Q_PersonWithPass)相匹配的通類型和資質要求,給我以下字段中一個輸出:

PersonID | PassType | QualificationField | QualificationAnswer 
54  | 3  | Q8     | Yes 
59  | 4  | Q3     | All 

我現在需要做的是在運行一個子查詢人員表查找與QualificationField相關的列,然後檢查Person表中的該字段是否與QualificationAnswer匹配。

我已經試過這樣:

SELECT  PersonID, PassType, QualificationField, QualificationAnswer, 
       (SELECT dbo.Q_PersonWithPass.QualificationField 
       FROM dbo.Person 
       WHERE (PersonID = dbo.Q_PersonWithPass.PersonID)) AS QualFld 
FROM   dbo.Q_PersonWithPass 

因此只是顯示在QualFld「Q8」或「Q3」,而不是回答「否」或「全部」

有沒有一種方法,我可以讓SQL將「dbo.Q_PersonWithPass.QualificationField」中的值識別爲列標題而不是子查詢中的變量?

+0

我不認爲這是可能的。 – ATC

+0

您可以構建動態SQL查詢http://www.kodyaz。com/articles/build-sql-server-dynamic-sql-query-example.aspx並用sp_executesql執行最終的查詢字符串 – Eralper

回答

0

正如在答案下的評論之一中提到的,我認爲做你想做的事情的唯一方法是通過生成一個動態的sql查詢。下面的代碼可能不是按鍵完美的,但它應該讓你知道該怎麼做。

這個想法是,你找出所有可能的資格域,將它們插入臨時表,然後基於所有可用選項動態構建一個case語句。

Select Distinct QualificationField 
    Into #TEMPTABLE 
    From dbo.Q_PersonWithPass; 

DECLARE 
@SQLQuery nvarchar(4000), 
@QField nvarchar(10) 
BEGIN 

Set @SQLQuery = 'select PWP.PersonId, PWP.PassType, PWP.QualificationField, PWP.QualificationAnswer, Case '; 

While EXISTS(Select * from #TEMPTABLE) 
Begin 
    Select Top 1 @QField = QualificationField From #TEMPTABLE; 
    Set @SQLQuery = @SQLQuery + 'When PWP.QualificationField = ' + @QField + ' Then P.' + @QFIELD + ' '; 
    Delete from #TEMPTABLE Where QualificationField = @QField; 
End 

Set @SQLQuery = @SQLQuery + ' end AS QualFld FROM dbo.Q_PersonWithPass PWP JOIN dbo.Person P on P.PersonID = PWP.PersonID'; 

EXECUTE sp_executesql @SQLQuery 

END; 

讓我知道你是否有任何問題。

+0

嗨,謝謝!我曾與動態SQL玩過,但沒有用太多,我看不出如何讓它工作。 我只需要對代碼進行編輯 - PWP.QualificationField ='+ @QField +'周圍的引號必須是'PWP.QualificationField ='''+ @QField +''''但是那麼這一切都很好! 乾杯 – Matt

+0

這個想法是你只是想構建你想運行到變量@SQLQuery的SQL語句,然後在最後執行它。 – MightyRearranger

+0

如果在最後一條End語句之前添加'print @SQLQuery',它將打印出查詢試圖運行的內容。我不確定當你現在嘗試時是否收到錯誤信息,或者根本不工作? – MightyRearranger

0

不確定你想要什麼樣的結果,但你可以通過使用CASE來實現你想要做的。沿線的東西:

SELECT PersonID, PassType, QualificationField, QualificationAnswer, 
    (CASE When p.PersonID = dbo.Q_PersonWithPass.PersonID then 'Yes' 
    else 'No' end) ASQualFld 
    FROM dbo.Q_PersonWithPass LEFT JOIN Person p on p.PersonID = dbo.Q_PersonWithPass.PersonID 
+0

在這個問題中,它說可以動態地將列添加到Person表中。如果發生這種情況,我認爲這會阻止你寫出一個能夠保證正常工作的明確的案例陳述? – MightyRearranger

相關問題