我實際上會提供兩個答案的混合,而不僅僅是一個查詢,但爲什麼。
看起來你想要一個給定的調查相關聯的所有元素,只要它符合你正在尋找的特定標準......這,我會給M.Ali的第一個答案,但第二個基於多個標準,你可能會感興趣於
但是,爲了進一步分析數據,每個調查的多個記錄可能不是實際的......相反,我會用一個交叉表結果。爲了驗證記錄,這將是一個優化。
首先,從簡單查詢開始,獲取符合多個條件的調查。我會在所有這三個領域在表上的索引在這種情況下(SURVEY_ID,VARNAME,VALUE)
SELECT
s1.*
FROM
YourTable s1
JOIN (SELECT s2.SURVEY_ID
FROM YourTable s2
JOIN YourTable s3
on s2.survey_id = s3.survey_id
AND s3.varname = 'SEX'
AND s3.value = 'Male'
JOIN YourTable s4
on s2.survey_id = s4.survey_id
AND s3.varname = 'ADJSAMP'
AND s3.value = 'Included'
WHERE s2.VARNAME = 'age'
AND s2.VALUE > 18) PreQual
on s1.SURVEY_ID = PreQual.Survey_ID
因此,內部查詢,你可以換在任何一種方式的標準,並增加額外加入更多標準(或更少)。無論你懷疑什麼是最小的結果標準,我會把「年齡」> 18的條款放在哪裏,並調整其他條款。
因此,內部查詢首先通過在同一個調查ID上添加額外連接(別名s3)來開始獲取年齡大於18的那些查詢,但不同的條件幾乎就像並排分析列一樣。如果它們不存在,整個調查將被忽略。找到符合條件的調查ID後,即會將其加入主表中以獲取所有行元素。
現在,使其更易於管理。放在每列的交叉標籤上。只需更改選擇字段標準併爲調查ID添加GROUP BY,但查詢的其餘部分將保持不變。
SELECT
s1.survey_id,
max(case when varname = 'PROVID' then value end) as Provider,
max(case when varname = 'SEX' then value end) as Gender,
max(case when varname = 'age' then value end) as Age,
max(case when varname = 'SP' then value end) as Specialty,
max(case when varname = 'ID#' then value end) as IDNumber,
max(case when varname = 'ADJSAMP' then value end) as AdjustSample
FROM
[rest of original query sample above]
GROUP BY
s1.survey_id
現在,如果你沒有應用任何標準過濾,上面的查詢會爲您提供結果類似...
survey_id Provider Gender Age Specialty IDNumber AdjustSample
674078265 provider name Female 55 Internal Med 12345 Included
674111111 provider name2 Male 34 Surgery 6789 Included
什麼數據類型是值列? –
歡迎來到EAV(實體屬性值)表的世界!根據整體設置,您可能可以進一步對此進行標準化,但調查是可能有用的領域之一。如果可以的話,我建議創建一個'VARNAME'表,這樣你就不會得到像'age','Age',''AGE','age'=「 #!*&business!「'。 –