2017-02-17 90 views
1

enter image description hereSQL SERVER兩個表

表A之間2014_差異 - 運動員誰參觀了醫院扭傷 表B - 運動員誰了跟進/跟隨UPS訪問/在家訪中扭傷

數據集大得多,只是給了一個片段作爲一個例子

我如何在SQL SERVER ....

  1. ,如果有一個FOLL流了幾天< 7,1的值賦給一個名爲西:COL_IND,否則爲0
  2. 列表中的第一個後續的日期,否則留空,放入一個名爲後續醫院就診之間
  3. 天山口和在國內第一跟進,如果沒有跟進留空,放入新的COL命名DAYS_TO_FOLLOW

我已經:

  1. SEPEARTED中SQL值基於訪問
  2. 我有代碼已經分離日將年,月,日

在那裏我卡住 3.我不知道是否做了連接兩個表的,因爲我需要的名字相匹配。也正在考慮一個IFF聲明,但我不知道如何得到名稱匹配。

這是我曾嘗試:

SELECT 
    CONVERT (float,#test1.["DATE"]) - CONVERT(float,#test2.["DATE"]) AS DIFF 
FROM #test1 
JOIN #test2 ON #test1.["NAME"] = #test2.["NAME"] 
+1

我希望你有更好的名字加入。你如何處理兩個人有相同名字的情況?爲了回答手頭的問題,我認爲你需要閱讀關於連接的內容。這聽起來很像我的一個基本的左連接。 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –

+0

好吧,你會加入PatientID。這聽起來像是一個基本的左連接。看到我鏈接的文章。 –

+0

我用名稱作爲例子,在我給出的數據集中,每個名稱都有一個唯一的患者ID。我使用了唯一的ID來加入我的實際代碼,但我在這裏更改了它以匹配我的示例。一個基本的左連接聽起來是合理的,因爲它會給沒有後續日期的值賦予NULL值,NULL會指示爲0.然後,我唯一的後續操作就是我將如何轉換爲日期。例如,我已將日期分解爲[2014] - [09] - [05],其中每個值都有自己的變量。在[2014] - [10] - [05] - [2014] - [09] - [04] = 1個月,1天的情況下爲 ,我將如何將其轉換爲幾天? –

回答

0

內部查詢識別每個人的第一次訪問,然後加入該到的人到醫院就診。

USE tempdb; 
CREATE TABLE dbo.HospitalVisit (Name VARCHAR(10), Code1 INT, VisitDate DATE); 
CREATE TABLE dbo.FollowUpVisit (Name VARCHAR(10), Code1 INT, VisitDate DATE); 

INSERT INTO dbo.HospitalVisit 
     (Name , 
      Code1 , 
      VisitDate 
     ) 
VALUES ('Chris',85,'20140905'), 
('Bob',85,'20140905'), 
('Angel',85,'20140905'), 
('Tyler',85,'20140905'), 
('Rick',85,'20140905'); 
INSERT INTO dbo.FollowUpVisit 
     (Name , 
      Code1 , 
      VisitDate 
     ) 
VALUES ('Chris',83,'20140915'), 
('Chris',83,'20141015'), 
('Chris',83,'20141018'), 
('Bob',83,'20140910'), 
('Angel',83,'20141006'); 


SELECT hv.Name, 
     HospitalVisitDate = hv.VisitDate, 
     Flag = CASE 
       WHEN DATEDIFF(DAY, hv.VisitDate, FUV.FirstVisit) < 7 THEN 
        1 
       ELSE 
        0 
       END, 
     FUV.FirstVisit, 
     DaystoFirstVisit = DATEDIFF(DAY, hv.VisitDate, FUV.FirstVisit) 
FROM dbo.HospitalVisit AS hv 
    LEFT JOIN 
     (SELECT FUV.Name, 
        FirstVisit = MIN(FUV.VisitDate) 
      FROM dbo.FollowUpVisit AS FUV 
      GROUP BY FUV.Name 
     ) AS FUV 
    ON hv.Name = FUV.Name; 

然而,你也許可以通過將在一個表中的所有的訪問和使用附加列指示訪問類型的簡化設計。之後提供了新的要求

代碼:

USE tempdb; 
IF OBJECT_ID('tempdb..HospitalVisit') IS NOT NULL 
    DROP TABLE dbo.HospitalVisit; 
GO 
IF OBJECT_ID('tempdb..FollowUpVisit') IS NOT NULL 
    DROP TABLE dbo.FollowUpVisit; 
GO 


CREATE TABLE dbo.HospitalVisit (Name VARCHAR(10),Code1 INT,VisitDate DATE); 
CREATE TABLE dbo.FollowUpVisit (Name VARCHAR(10),Code1 INT,VisitDate DATE); 

INSERT INTO dbo.HospitalVisit (Name,Code1,VisitDate) 
    VALUES ('Chris', 85, '20140905'), 
    ('Bob', 85, '20140905'), 
    ('Bob', 85, '20141005'), 
    ('Angel', 85, '20140905'), 
    ('Tyler', 85, '20140905'), 
    ('Rick', 85, '20140905'); 
INSERT INTO dbo.FollowUpVisit (Name,Code1,VisitDate) 
    VALUES ('Chris', 83, '20140915'), 
    ('Chris', 83, '20141015'), 
    ('Chris', 83, '20141018'), 
    ('Bob', 83, '20140920'), 
    ('Bob', 83, '20140910'), 
    ('Bob', 83, '20141010'), 
    ('Bob', 83, '20141020'), 
    ('Angel', 83, '20140901'), 
    ('Tyler', 85, '20140904'), 
    ('Angel', 83, '20141006'); 

WITH cte 
AS (SELECT hv.Name, 
      HospitalCode = hv.Code1, 
      HospitalVisit = hv.VisitDate, 
      FUCode = fuv.Code1, 
      FirstFollowUpVisit = fuv.VisitDate, 
      FUSeq = ROW_NUMBER() OVER (PARTITION BY hv.Name, hv.VisitDate ORDER BY fuv.VisitDate), 
      DaystoFirstFollowUp = DATEDIFF(DAY,hv.VisitDate, fuv.VisitDate) 
    FROM dbo.HospitalVisit AS hv 
     LEFT JOIN dbo.FollowUpVisit AS fuv 
     ON hv.Name = fuv.Name 
      AND hv.VisitDate <= fuv.VisitDate 
    ) 
SELECT cte.Name , 
     cte.HospitalCode , 
     cte.HospitalVisit , 
     cte.FUCode , 
     cte.FirstFollowUpVisit , 
     cte.DaystoFirstFollowUp 
FROM cte 
WHERE cte.FUSeq = 1; 

我增加了一些新的樣本數據。 鮑勃有兩次醫院就診和三次新的隨訪。

天使在醫院訪視前以及隨後的訪問之前進行了隨訪。

泰勒不得不之前醫院就診後續訪問:

結果:

Name HospitalCode HospitalVisit FUCode FirstFollowUpVisit DaystoFirstFollowUp 
Angel 85 2014-09-05 83 2014-10-06 31 
Bob 85 2014-09-05 83 2014-09-10 5 
Bob 85 2014-10-05 83 2014-10-10 5 
Chris 85 2014-09-05 83 2014-09-15 10 
Rick 85 2014-09-05 NULL NULL NULL 
Tyler 85 2014-09-05 NULL NULL NULL 

注:因爲不包括訪問時間,在同一天,FU訪問作爲醫院的訪問是被視爲在醫院訪視後發生。您可以將訪問條件從AND hv.VisitDate < = fuv.VisitDate更改爲AND hv.VisitDate < fuv.VisitDate(如果不正確)。

+0

哇這個代碼正是我所期待的。一個問題。我應該看看訪問後的隨訪。有時候,你有一個(在家拜訪),然後去醫院看看,然後在家裏拜訪。這使我在我的作品中產生了負面的價值。 –