3 Stimmen

Berechnung der prozentualen Beteiligung über Spalten

Ich bin mir nicht sicher, ob die Frage korrekt ist, aber mir ist keine Möglichkeit eingefallen, sie zu formulieren. Ich werde versuchen, es anhand eines Beispiels zu erklären.

Betrachten Sie eine Tabelle von einzelnen Krankenhausbesuchen mit Attributen für die VisitID (VID), Patienten-ID (PID) und Krankenhaus-ID (HID).

 VID  PID  HID
  1    A    x
  2    A    y
  3    A    x
  4    B    z
  5    B    z

Was ich vorhabe, ist PID-HID-Paare zu identifizieren, bei denen mehr als 50 % der gesamten VIDs für diesen PID in dem angegebenen HID waren. In diesem Fall möchte ich "A & x" zurückgeben, da 2/3 der gesamten VIDs für PID "A" in HID "x" waren und "B & Z", da alle VIDs für "B" in "z" waren.

2voto

NotMe Punkte 86089

Dies mag zwar unangenehm sein, aber ich denke, es erledigt den Job. Es wird angenommen, dass Ihre Tabelle visits heißt

;with infoCte as (
select pid, hid, count(*) as visitcount
from visits
group by pid, hid
) 

select * 
from infocte i
where visitcount > (
    select count(*) / 2 as midcount
        from visits v
        where v.pid = i.pid
) 

Der erste Teil gibt alle Besuchsanzahlen pro Patient und Krankenhaus aus. Der zweite Teil beschränkt die Ergebnisse nur auf diejenigen, die dieses bestimmte Krankenhaus mehr als 50% der Zeit besucht haben. Wenn Sie genau 50% und mehr benötigen, ändern Sie das > in ein >=.

0voto

geomagas Punkte 3230

Versuchen Sie dies:

select PID,HID,100*cast(PHtotal as float)/Ptotal as PHperc
from
  (select PID,count(*) as Ptotal from tbl group by PID) t,
  (select PID,HID,count(*) as PHTotal from tbl group by PID,HID) s
where s.PID=t.PID and cast(PHtotal as float)/Ptotal>0.5

EDIT: Fehlende Konvertierungen zu float hinzugefügt

0voto

sqlint Punkte 1061

Es funktioniert auf SQL 2012.

Hier ist eine Demo auf SqlFiddle.

with cte
as
(
select *, COUNT(PID) OVER(PARTITION BY PID, HID ORDER BY HID)*100.00/COUNT(PID) OVER(PARTITION BY PID ORDER BY PID) cnt
from visits
)

select *
from cte 
where cnt > 50

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X