2017-02-17 9 views
1

enter image description hereSQL Serverの二つのテーブル

表Aの間2014_違い - 捻挫 表Bのために病院を訪れた選手 - 従う/フォローアップの訪問を持っていた選手/捻挫

のため自宅での訪問

DATASET、はるかに大きいだけの例Iは、SQL Serverにはどうすればよい

としてスニペットを与えた....

  1. follがあった場合OWアップ日< 7で、名前のCOLに1の値を割り当てる:COL_IND、それ以外の他の0
  2. 一覧最初のフォローのDATEは、病院の訪問の間
  3. 日follow_upという名前COLに入れ、空白のままにし、何のフォローアップ新しいCOLという名前DAYS_TO_FOLLOWに置き、空白のままにしていないがあった場合は、最初、自宅でフォローアップ

私は既に持っている:SQLで

  1. SEPEARTED値を私が持っている
  2. の訪問に基づいてコードそれは、年、月に日付とその日私は私が名前が一致持っている必要があるため、二つのテーブルの結合を行うかどうかわかりません3. こだわっている

を分離しています。また、IFFの声明を検討していたが、私はどのように私は一致するように名前を取得するのか分からない。ここで

は、私が試したものです:

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

名前に参加するよりも良いものがあることを願っています。2人が同じ名前を持っている状況はどうやって対処していますか?手元にある問題に答えるために、あなたはジョインについて読む必要があると思います。これは私にとって基本的な左の結合のように聞こえる。 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –

+0

OK、あなたは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; 

しかし、あなたはおそらく1つのテーブル内のすべてのあなたの訪問を置いて、訪問の種類を示すために、追加の列を使用して設計を効率化できます。

コードが提供された新しい要件の後:

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; 

私はいくつかの新しいサンプル・データを追加しました。 ボブには2回の病院訪問と3回のフォローアップ訪問がありました。

エンジェルは病院訪問の前と後にフォローアップ訪問しました。

結果::

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

このコードは、私が探しているものです。 1つの問題。私は訪問の後に来るフォローアップを見ているは​​ずです。場合によっては、(自宅で)訪問してから病院を訪問し、自宅で訪問します。それが私の決定に負の値を持つ原因になっている。 –