2017-02-17 15 views
1

enter image description hereSQL SERVER 2014_ Unterschied zwischen zwei Tabellen

Tabelle A - Athleten, die ein Krankenhaus für eine Verstauchung Tabelle B besucht - Sportler, die ein/Follow-up hatten folgen ups besuchen/Besuche zu Hause für die Verstauchung

Die DATASET ist viel größer, gab nur einen Ausschnitt als Beispiel

wie kann ich in SQL Server ....

  1. Wenn es eine folg war ow bis in Tagen < 7, weisen einen Wert von 1 zu einer Spalte namens: COL_IND, sonst 0
  2. Schreiben Sie das Datum des ersten Followup, sonst leer lassen, in eine col namens FOLLOW_UP
  3. Tage zwischen Krankenhausbesuch und zuerst zu Hause verfolgen, wenn es nach oben keine Folge leer lassen, legen Sie in neue COL namens DAYS_TO_FOLLOW

ich habe bereits:

  1. SEPEARTED die Werte in SQL basierend auf Besuch
  2. ich habe Code das hat das Datum in Jahr, Monat und Tag

getrennt Wo ich bin stecken 3. Ich weiß nicht, ob eine Verknüpfung der beiden Tabellen tun, weil ich die Namen übereinstimmen müssen müssen. Ich habe auch ein IFF-Statement in Betracht gezogen, aber ich weiß nicht, wie ich die passenden Namen bekommen würde. Hier

ist, was ich habe versucht:

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

Ich hoffe, Sie haben etwas Besseres als Name, um mitzumachen.Wie gehen Sie mit Situationen um, in denen zwei Personen den gleichen Namen haben? Um das Problem zu lösen, denke ich, dass Sie über Joins nachlesen müssen. Das klingt sehr nach einer einfachen Linke zu mir. http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –

+0

OK, damit Sie bei PatientenID beitreten. Dies klingt immer noch wie ein einfacher linker Join. Siehe den Artikel, den ich verlinkt habe. –

+0

Ich verwendete Namen als Beispiel, in dem Datensatz, den ich erhielt, erhält jeder Name eine eindeutige Patienten-ID. Ich verwendete die eindeutigen IDs, um meinen tatsächlichen Code beizutreten, aber ich änderte es hier, um meinem Beispiel zu entsprechen. Ein einfacher linker Join hört sich vernünftig an, da er Werten ohne Follow-up-Datum einen NULL-Wert geben würde. NULL würde 0 anzeigen. Mein einziges Follow-Up ist dann, wie ich über die Konvertierung in Tage gehen würde. Zum Beispiel habe ich das Datum in [2014] - [09] - [05] unterteilt, wobei jeder Wert eine eigene Variable hat. in einem Fall von [2014] - [10] - [05] - [2014] - [09] - [04] = 1 Monat, 1 Tag, wie würde ich das nur in Tage umwandeln? –

Antwort

0

Inner Abfrage den ersten Besuch für jede Person identifiziert, schließt sich dann, dass an den Personen Besuch im Krankenhaus.

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; 

Allerdings könnten Sie wahrscheinlich Ihr Design, indem sie alle Ihre Besuche in einer Tabelle straffen und mit einer zusätzlichen Spalte die Besuchsart anzuzeigen.

-Code nach neuen Anforderungen zur Verfügung gestellt:

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; 

ich einige neue Beispieldaten. Bob hatte zwei Krankenhausbesuche und drei neue Nachuntersuchungen.

Angel hatte einen Follow-up-Besuch vor dem Krankenhausbesuch sowie danach.

Tyler hatte einen Follow-up-Besuch vor dem Krankenhaus besuchen:

Ergebnisse:

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 

Hinweis: seit Besuchszeit ein FU Besuch am selben Tag nicht enthalten ist, als ein Krankenhaus Besuch gezählt nach dem Krankenhausbesuch. Sie können die Besuchsbedingung von AND hv.VisitDate < = fuv.VisitDate in AND hv.VisitDate ändern < fuv.VisitDate, wenn das nicht korrekt ist.

+0

Woah dieser Code ist genau das, was ich suche. Ein Problem. Ich sollte auf Follow-ups schauen, die nach einem Besuch kommen. Manchmal haben Sie einen (Besuch zu Hause) und dann einen Besuch im Krankenhaus und dann einen Besuch zu Hause. was dazu führt, dass ich negative Werte in meinem datediff habe. –

Verwandte Themen