2017-10-11 45 views
0

我是新來的SQL,嘗試自我教導,並且已經與我一樣掙扎,應該是一個非常簡單的查詢,或者至少是一個非常常見的一個。我甚至不確定我是否知道用詞彙來描述我想要達到的目標,所以如果這個帖子的標題竟然是誤導性的,那麼我很抱歉! :)在同一個查詢中使用相同的列對不同組合的結果返回數據

我有一個大的數據庫。我想識別一行中2個結果一起出現的行,或者同一列中的另一個2個結果在設定的時間段內一起出現。

我開始使用AND但結果爲零。我花了整整兩三個小時在網上搜索,但成果有限。似乎有很多類似的線程暗示UNION,SELECT DISTINCT,JOIN或其他解決方案,但我完全無法根據我的需要調整它們。

任何指針非常讚賞。

所以,我的表稱爲VNH.dbo.ClinicalCaseItem

數據表看起來像這樣:

ActualDateTime | CaseId | ProcedureTestId | Description | FeeAmount 

我需要限制ActualDateTime大於2017-04-03或條目的數量會碰上十萬100S 。 ProcedureTestId是關鍵列。我需要專門將CaseIdProcedureTestId 309ProcedureTestId 245一起出現,而那些CaseIdProcedureTestId 309ProcedureTestId 326一起出現。

我不會詳細說明我嘗試過的所有不同的查詢,因爲已經有半打左右,沒有人接近實現我需要的結果,而且大多數都完全失敗。

提前感謝

示例數據:

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 
    2017-04-27 | 134523 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00 
    2017-04-28 | 345321 | 245    | Sedate Patient | 45.00 
    2017-04-29 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 999999 | 326    | Bathe Patient  | 45.00 
    2017-04-27 | 987654 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 
    2017-04-27 | 987654 | 326    | Bathe Patient  | 45.00 

查詢的預期結果將是:

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount | count_of 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 | 2 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00  | 3 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00  | 3 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 | 3 
+0

實際的數據樣本將幫助。問題:「鍵列」是什麼意思?它是主鍵還是外鍵? – Alex

+0

對不起,只是說 - 最重要的 - 就像我的問題所依賴的那個。 示例數據: – be4con

+0

示例數據請輸出您想要的結果。 – Alex

回答

1

有樣本數據是非常有幫助的,但除非它被耦合到「預期的結果」,我們不能比較任何查詢輸出;因此我們只能發明一些可能起作用的東西 - 這是我在下面介紹的。

我對你的話的解釋是,如果案件至少經過程序(309和245)或(309和326),你需要caseid。現在,當我將該要求與示例數據進行比較時,我找不到符合該標準的任何行,因此我添加了一些符合該條件的行。但是還要注意,在邏輯上我採用了任何有程序的案例(245和326,但不是309)也將被退回。

這裏的基本「技巧」(又名「方法」)是在SUM()函數中使用一個case表達式,並使用having子句(允許基於聚合值過濾結果)對其進行評估。

This SQL Fiddle讓我們來執行您自己的試用查詢。

的MS SQL Server 2014架構設置

CREATE TABLE Table1 
    ([ActualDateTime] datetime, [CaseId] int, [ProcedureTestId] int, [Description] varchar(17), [FeeAmount] int) 
; 

INSERT INTO Table1 
    ([ActualDateTime], [CaseId], [ProcedureTestId], [Description], [FeeAmount]) 
VALUES 
    ('2017-04-25 00:00:00', 989898, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 989898, 245, 'Sedate Patient', 45.00), 

    ('2017-04-25 00:00:00', 999999, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 999999, 245, 'Sedate Patient', 45.00), 
    ('2017-04-27 00:00:00', 999999, 326, 'whatever 326 is', 45.00), 

    ('2017-04-25 00:00:00', 123456, 309, 'Place iv catheter', 30.00), 
    ('2017-04-25 00:00:00', 123456, 329, 'GA Patient', 100.00), 
    ('2017-04-27 00:00:00', 134523, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 234567, 245, 'Sedate Patient', 45.00), 
    ('2017-04-28 00:00:00', 234567, 309, 'Place iv catheter', 30.00), 
    ('2017-04-28 00:00:00', 345321, 245, 'Sedate Patient', 45.00), 
    ('2017-04-29 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 375, 'Surgical Pack', 28.00) 
; 

查詢1

 select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 

Results

| CaseId | count_of | 
|--------|----------| 
| 234567 |  2 | 
| 451324 |  2 | 
| 989898 |  2 | 
| 999999 |  3 | 

查詢2

select 
     t.*, d.count_of 
from Table1 t 
inner join (
     select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 
    ) d on t.CaseId = d.CaseId 
order by caseid, ProcedureTestId 

Results

|  ActualDateTime | CaseId | ProcedureTestId |  Description | FeeAmount | count_of | 
|----------------------|--------|-----------------|-------------------|-----------|----------| 
| 2017-04-27T00:00:00Z | 234567 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-28T00:00:00Z | 234567 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-29T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    375 |  Surgical Pack |  28 |  2 | 
| 2017-04-27T00:00:00Z | 989898 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-25T00:00:00Z | 989898 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-27T00:00:00Z | 999999 |    245 | Sedate Patient |  45 |  3 | 
| 2017-04-25T00:00:00Z | 999999 |    309 | Place iv catheter |  30 |  3 | 
| 2017-04-27T00:00:00Z | 999999 |    326 | whatever 326 is |  45 |  3 | 
+0

注意「預期結果」的重要性(例如,您是想要總結還是詳細布局?),而且樣本數據也應該爲「預期結果」提供數據。 –

+0

謝謝。有趣的是,我提供的樣本數據確實有匹配的行,但您的解釋是正確的。查詢2的結果幾乎是我正在尋找的。我需要不包含ProcedureTestId 309的行CaseId和不包含309,326或245的任何ProcedureTestId,因此所有CaseId 451324和最後一行999999都將被排除。我將編輯我的文章以包含擴展數據表並添加結果表。 – be4con

相關問題