Erstellen Sie eine Ansicht aus der select-Anweisung, die verwendet mehrere temporäre Tabellen in T-SQL zu entfernen, die Notwendigkeit für die temp-Tabellen

Wir haben eine sehr normalisierte SQL-2005-Datenbank. Das problem ist, dass ich brauche eine Abfrage, die de-normalisiert die Daten und stellt Sie in Aussicht. Derzeit habe ich eine Abfrage, bekommt das gewünschte Ergebnis festlegen, aber ich bin mit drei temporären Tabellen zu tun, und wechseln Sie in eine Ansicht, in Bezug auf die Ausführung der SQL über eine Dritte Partei reporting-software, die wir nicht geben wollen, die Möglichkeit zum erstellen von temporären Tabellen. Da die Ansicht muss ein einzelnes select-Anweisung; ich bitte um Hilfe bei meiner hässlich-Abfrage in einer einzigen select-Anweisung, kann eine Ansicht.

Den Tabellen beteiligt sind:
ModelResults [CustomerID,ModelID,RunDate,Score,ModelResultID(= modelresultsreviewid)]

Customers [CustomerID]

Models [ModelName,ModelID]

Die Ansichten beteiligt sind:
(dies ist die Menge aller ModelResults, dass ein Review -)
vw_exp_review [CustomerID,modelresultsreviewid]

Ihre Beziehung ist wie folgt:

Jeder Kunde hat eine CustomerID; aber nicht unbedingt ein ModelResult oder Abgeben oder entweder

Jedes Modell hat eine ModeID und ModelName

Jeder ModelResult hat eine "CustomerID", ModelID,RunDate,und die Partitur, aber nicht unbedingt eine Überprüfung

Jede Kritik(vw_exp_review) hat eine CustomerID und modelresultsreviewid

Ziel der Abfrage ist zu finden, die CustomerIDs,Noten,Modelle, und RunDates, alle haben die gleiche CustomerID und ModelID wo:

  1. Gibt es keine modelResults oder Bewertungen (in dem Fall alle, die zurückgegeben wird, ist ein CustID)

  2. Zuletzt Erzielte Modell (Max(RunDate)) regarless der Beurteilung

  3. Zuletzt Erzielte Modell (Max(RunDate)) geprüft wurde

Generell gibt es drei Arten von Ausgabe -

  1. CustomerID, MostRecentScore,MostRecentReviewedScore -, Modell-und MaxDate

  2. CustomerID,MostRecentScore -, Modell-und MaxDate

  3. CustomerID

Als heute, ich bin immer noch mit dem folgenden:

DROP TABLE #_T1

-- MostRecentScore

SELECT CustomerID,ModelID,ModelResultID,RunDate,Min(Score) as MinScore

INTO #_T1

FROM ModelResults m1 WITH (NOLOCK)

WHERE RunDate IN (SELECT MAX(m.RunDate) FROM ModelResults m GROUP BY m.CustomerID)

GROUP BY

CustomerID,ModelID,ModelResultID,RunDate




DROP TABLE #_T2

--MostRecentReviewedScore

SELECT CustomerID,ModelID,RunDate,MIN(Score) AS MinScore

INTO #_T2

FROM ModelResults m1 WITH (NOLOCK)

WHERE RunDate IN (SELECT MAX(RunDate) 

                FROM ModelResults t JOIN vw_exp_review r ON 

                                    r.modelresultsreviewid = t.ModelResultID

                GROUP BY t.CustomerID)

GROUP BY CustomerID,ModelID,RunDate



DROP TABLE #_T3

--MostRecentModelResultDate

SELECT c.CustomerID,MAX(RunDATE) as MAXDate

INTO #_T3

FROM ModelResults mr WITH (NOLOCK)

RIGHT OUTER JOIN Customers C

ON mr.CustomerID = c.CustomerID

GROUP BY c.CustomerID



SELECT t3.CustomerID,t1.MinScore as MostRecentScore,

t2.MinScore as MostRecentReviewedScore,m.Model as ModelName,

t3.MaxDate

FROM #_T1 t1

LEFT OUTER JOIN #_T2 t2

ON t1.CustomerID = t2.CustomerID AND t1.ModelID = t2.ModelID

RIGHT OUTER JOIN #_T3 t3

ON t1.CustomerID = t3.CustomerID

LEFT OUTER JOIN Models m

ON t1.ModelID = m.ModelID


ORDER BY
t3.CustomerID

Beispiel-Ausgabe:

CustID,MostRecentScore,MostRecentReviewed,ModelName,MaxDate

8,2.36,4.59,Unrated Scorecard,2011-08-10 15:08:53.807

1361,2.76,NULL,SET Rated,2010-04-20 20:48:39.530

1362,NULL,NULL,NULL,NULL

Sie wissen, dass #_T1 passen max RunDate auf einen anderen Kunden?
Ist nicht die Tatsache, dass es ist gruppiert nach CustomerID behandeln andere Kunden auf dem gleichen Datum? Das ResultSet keine Wiederholungen von Daten, die nicht direkt mit der Rückseite an den entsprechenden Kunden.
Ja, es finden die anderen Kunden auf dem gleichen Datum. Es werden auch andere Kunden auf andere Termine.

InformationsquelleAutor ASheppardWork | 2013-01-15

Schreibe einen Kommentar