SELECT
H.vehicle_code,
G.group_name,
VehicleTotal = Count(D.cusip_sedol) OVER (PARTITION BY H.vehicle_code, G.group_name),
d.gic_code,
gic_codePercentPerVehicleName =
Count(d.gic_code) OVER() * 1.0/Count(*) OVER (PARTITION BY V.vehicle_name),
gic_codePercentPerVehicleName2 =
Count(d.gic_code) * 1.0/Count(*) OVER (PARTITION BY V.vehicle_name)
FROM
dbo.tbltrading_holdings H
INNER JOIN tbltrading_stocks_data_stocks D
ON H.cusip_sedol = D.cusip_sedol
LEFT JOIN dbo.tbltrading_gic G
ON D.gic_code = G.gic_code
INNER JOIN dbo.tbltrading_vehicles V
ON H.vehicle_code = V.vehicle_code
AND v.vehicle_name LIKE 'J%'
WHERE
D.gic_code IS NOT NULL
GROUP BY
H.vehicle_code,
D.gic_code,
G.group_name,
V.vehicle_name
ORDER BY
H.vehicle_code
;
Es gibt einige Unbekannte hier, die mich gezwungen haben, bestimmte Annahmen zu treffen. Sie können sehen, dass ich zwei verschiedene Interpretationen darüber entwickelt habe, was "Gic Code pro Fahrzeugname" bedeuten könnte.
Für den Anfang ist es die vehicle_name
jeder gic_code
zugeordnet ist, haben wir eine echte beitreten, kein IN
(was effektiv eine EXISTS
ist) zu tun. Ist es jedoch möglich, dass gic_code
zu verschiedenen vehicle_name
Werten zusammengefügt werden? (Da gibt es eine Zwischenstufe vehicle_code
, die sie verbindet?) Ich gehe davon aus, dass es nicht möglich ist, dies zu geschehen, und wenn es tatsächlich ist, wird die Abfrage unbrauchbare Ergebnisse geben, und Sie müssen besser was genau formulieren Sie suchen, bevor wir Ihnen mehr helfen können.
Als nächstes werden die Ergebnisse durch die Tatsache verdüstert, dass Sie so viele Spalten auswählen, die sie zwingt, Teil der GROUP BY
zu sein. Aber sobald Sie das tun, müssen alle Fensterfunktionen Partitionen enthalten, um sie aus der Gruppierung zu "brechen". Diese Abfrage wird möglicherweise langsam ausgeführt, da sie häufig gleichzeitig ausgeführt wird, was zu vielen Scans der Tabelle führen kann. So wie die Dinge jetzt sind, erhalten Sie für jeden einzelnen gic_code
viele Zeilen mit dem gleichen Wert, weil die Abfrage die (mehrere) vehicle_code
und group_name
Kombinationen für jeden freigibt. Willst du das wirklich?
Sie könnten bessere Ergebnisse erzielen, wenn Sie einige der angezeigten Spalten entfernen, da Sie damit mindestens einen Teil der PARTITION BY
Ausdrücke entfernen könnten.
Zuletzt, ich bin mir nicht sicher, ob ich sogar die Partitionen richtig habe. Nur Sie kennen die Kardinalität jeder Spalte in Bezug auf die Joins zu anderen Tabellen.
Es wäre hilfreich, wenn Sie einen Beispieldatensatz mit Tabellenstruktur hinzufügen, damit die Leute eine kleine Testumgebung einrichten können, die Ihnen schneller und genauer hilft. – Reboon
Um den 'vehicle_name' bereitzustellen, mit dem jeder' gic_code' verknüpft ist, müssen Sie einen echten Join machen, nicht ein 'IN' (was effektiv ein' EXISTS' ist). Ist es jedoch möglich, dass der gleiche 'gic_code' an verschiedenen 'vehicle_name'-Werten anknüpft? (Da es einen intermediate 'vehicle_code' gibt, der sie verbindet?) – ErikE
Jedes Fahrzeug hat mehrere cusip_sedols und jedes cusip_sedol hat einen GIC-Code. Jeder GIC-Code ist mehreren cusip_sedolen zugeordnet, und jeder cusip_sedol ist mehreren Fahrzeugen zugeordnet. –