Access Migration auf SQL Server

Babsi

SQL-Guru
Beiträge
122
Hallo zusammen,

ich bin dabei Prozesse, die noch in Access ablaufen auf den SQL Server zu migrieren.
Dabei habe ich schon eine Menge angepasst, bei einigen Abfragen jedoch vertstehe ich nicht, warum die Ergebnisse so unterschiedlich sind.

Kann mir jemand einen Tipps geben?
Ich habe die Abfragen hier mal abgebildet:

Original aus Access:
SELECT DISTINCTROW 0 AS OK, "ec" AS [Short], "ec-Provision"
AS Descr,
"" AS WhyNot,
11 AS Kostenstelle,
CLng([PROVISION].[RESELLER_ID]) AS RID,
CLng([BILLPOS].[TERMINAL_ID]) AS TID, Month([BILL_DATE]) AS BMoth,
Year([BILL_DATE]) AS BYear,
0.0001 AS [RLV-Wert], BILL.BILL_DATE,
Max(BILLPOS.BPOS_UNTIL) AS Buntil,
[zzHilfstabelle->Prov LastProv].Last, Sum(BILLPOS.ProvWert) AS PWert,
Sum(BILLPOS.ProvAnz) AS PAnz, Sum(BILLPOS.BPOS_VOLUME) AS BVol,
PROVISION.PROVISION_EC, 0.0001 AS Wert,
BILL.CURRENCY_ID,
BILLPOS.BILL_ID,
"ec" AS What,
Max(BILLPOS.BTCOST_ID) AS BTCID,
[zzHilfstabelle->Prov LastProv].bis,
PROVISION.PROVISION_StartWhen,
PROVISION.PROVISION_EndWhen

FROM (((BILLPOS INNER JOIN BILL ON BILLPOS.BILL_ID = BILL.BILL_ID)
INNER JOIN PROVISION ON BILLPOS.TERMINAL_ID = PROVISION.TERMINAL_ID)
INNER JOIN RESELLER ON PROVISION.RESELLER_ID = RESELLER.RESELLER_ID)
INNER JOIN [zzHilfstabelle->Prov LastProv] ON RESELLER.RESELLER_ID = [zzHilfstabelle->Prov LastProv].RESELLER_ID

WHERE (((BILL.BILL_DATE)>[Last]
And (BILL.BILL_DATE)<=[bis]
And (BILL.BILL_DATE)>=IIf(IsNull([PROVISION_StartWhen]),[BILL_DATE],[PROVISION_StartWhen]) And (BILL.BILL_DATE)>#31/12/2007#)
AND ((PROVISION.PROVISION_EC)>0)
AND ((BILLPOS.BTCOST_ID)=1 Or (BILLPOS.BTCOST_ID)=50 Or (BILLPOS.BTCOST_ID)=51 Or (BILLPOS.BTCOST_ID)=52))
GROUP BY 0, "ec-Provision", "", 11, CLng([PROVISION].[RESELLER_ID]), CLng([BILLPOS].[TERMINAL_ID]), Month([BILL_DATE]), Year([BILL_DATE]), BILL.BILL_DATE, [zzHilfstabelle->Prov LastProv].Last, PROVISION.PROVISION_EC, 0.0001, BILL.CURRENCY_ID, BILLPOS.BILL_ID, "ec", [zzHilfstabelle->Prov LastProv].bis, PROVISION.PROVISION_StartWhen, PROVISION.PROVISION_EndWhen, 0.0001, "ec"
HAVING (((PROVISION.PROVISION_StartWhen)>=[Forms].[wPU -> Provisionen erstellen]![VonDatum] Or (PROVISION.PROVISION_StartWhen) Is Null) AND ((PROVISION.PROVISION_EndWhen)>[Forms].[wPU -> Provisionen erstellen]![BisDatum] Or (PROVISION.PROVISION_EndWhen) Is Null))
ORDER BY CLng([PROVISION].[RESELLER_ID]), CLng([BILLPOS].[TERMINAL_ID]), BILL.BILL_DATE;

Version für SQL Server:
SELECT DISTINCT 0 AS OK, 'ec' AS [Short], 'ec-Provision'AS Descr,
'' AS WhyNot,
11 AS Kostenstelle,
[PROVISION].[RESELLER_ID] AS RID, [BILLPOS].[TERMINAL_ID] AS TID,
Month([BILL_DATE]) AS BMoth,
Year([BILL_DATE]) AS BYear,
0.0001 AS [RLV-Wert],
BILL.BILL_DATE,
Max(BILLPOS.BPOS_UNTIL) AS Buntil, [Last] ,
Sum(BILLPOS.ProvWert) AS PWert,
Sum(BILLPOS.ProvAnz) AS PAnz, Sum(BILLPOS.BPOS_VOLUME) AS BVol, PROVISION.PROVISION_EC, 0.0001 AS Wert,
BILL.CURRENCY_ID, BILLPOS.BILL_ID,
'ec' AS What,
Max(BILLPOS.BTCOST_ID) AS BTCID,
[bis],
PROVISION.PROVISION_StartWhen,
PROVISION.PROVISION_EndWhen

FROM (((data.BILLPOS
INNER JOIN data.BILL ON BILLPOS.BILL_ID = BILL.BILL_ID)
INNER JOIN data.PROVISION ON BILLPOS.TERMINAL_ID = PROVISION.TERMINAL_ID)
INNER JOIN data.RESELLER ON PROVISION.RESELLER_ID = RESELLER.RESELLER_ID)
INNER JOIN dbo.[zzHilfstabelle->Prov LastProv] ON RESELLER.RESELLER_ID = [zzHilfstabelle->Prov LastProv].[RESELLER_ID]
WHERE BILL.BILL_DATE>[Last]
And (BILL.BILL_DATE)<=[bis]
And BILL.BILL_DATE >=IIf([PROVISION_StartWhen] is null,[BILL_DATE],[PROVISION_StartWhen])
And BILL_DATE>'2007.10.31' AND PROVISION.PROVISION_EC >0
AND (BILLPOS.BTCOST_ID)=1 Or (BILLPOS.BTCOST_ID)=50 Or (BILLPOS.BTCOST_ID)=51 Or (BILLPOS.BTCOST_ID)=52
GROUP BY [PROVISION].[RESELLER_ID], [BILLPOS].[TERMINAL_ID], Month([BILL_DATE]),BILL.BILL_DATE,
[Last], PROVISION.PROVISION_EC, BILL.CURRENCY_ID, BILLPOS.BILL_ID, [bis], PROVISION.PROVISION_StartWhen, PROVISION.PROVISION_EndWhen
HAVING (((PROVISION.PROVISION_StartWhen)>='2023.07.01' Or (PROVISION.PROVISION_StartWhen) Is Null)
AND ((PROVISION.PROVISION_EndWhen)>'2023.10.31'Or (PROVISION.PROVISION_EndWhen) Is Null))
ORDER BY [PROVISION].[RESELLER_ID], [BILLPOS].[TERMINAL_ID], BILL.BILL_DATE;

Erste Ergebnis: 280 DS
Zweites Ergebnis: 116.522 DS

Die Ausgangsdateien sind gleich...
Was läuft den da falsch?

Grüße, Babsi
 
Werbung:
Schwer zu sagen.
DistinctRow kenne ich nicht, vielleicht macht das was anderes als Distinct. Was Distinct macht, wenn sowieso gruppiert wird, weiß ich auch nicht.

Was auffällt, im 2. Statement ist das Group By ganz anders. Es passt nicht sehr gut zur Select Clause. Das kann vielleicht ok sein, kommt auf die Primary Key in den Tabellen an und die magischen Fähigkeiten von SQL Server, anhand der am Group By beteiligten PK auf abhängige Gruppenfelder zu schließen, die er dann trotz fehlender Angaben selbst erschließen kann.
Es ist immer gut, sich an die Faustregel zu halten und alles zu gruppieren, was nicht aggregiert wird. No Magic. In der Access Version ist das sauberer.

Außerdem gibt es in der SQL Server Version konkrete Werte in der Having Clause. Das kannst nur Du herleiten, Du bist die einzige, die Daten und Formvariablen aus beiden Versionen kennt.
 
Hallo dabadepdu,
hab vielen Dank für die Ausführungen.

Distintrow gibt es in SQL server nicht, und nun denke ich, weiss ich auch wo der Fehler ist.

Beschreibung DISTINCTROW Aus der OH
Lässt Daten aus, die auf vollständigen doppelten Datensätzen basieren, nicht nur auf doppelten Feldern. Sie können beispielsweise eine Abfrage erstellen, mit der die Customers-Tabelle (Kunden) und die Orders-Tabelle (Bestellungen) im CustomerID-Feld (Kunden-Nr) verknüpft werden. Die Customers-Tabelle enthält keine doppelten Felder mit Namen CustomerID, in der Orders-Tabelle ist dies jedoch der Fall, da jedem Kunden mehrere Bestellungen zugeordnet sein können. Die folgende SQL-Anweisung zeigt, wie Sie mithilfe des DISTINCTROW-Prädikats eine Liste von Firmen erstellen können, die über mindestens eine Bestellung verfügen, ohne dass die Details zu den Bestellungen abgefragt werden

Das 2. Group by, musste ich anpassen, wegen Fehlermeldungen 'äussere Verweise', vielleicht ist da was nicht korrekt.
Ich versuche mich da nun langsam ran zu tasten..


Grüße, Babsi
 
Ich denke es liegt an der Klammersetzung beim OR im Where-Kriterium
Da fehlt eine Klammer - du hebelst damit den Rest der ANDs aus. Beim letzten AND muss eine weitere Klammer über die restlichen OR's sein.

Access:
AND (
(BILLPOS.BTCOST_ID) = 1
OR (BILLPOS.BTCOST_ID) = 50
OR (BILLPOS.BTCOST_ID) = 51
OR (BILLPOS.BTCOST_ID) = 52
)

Vs SQL

AND (BILLPOS.BTCOST_ID) = 1
OR (BILLPOS.BTCOST_ID) = 50
OR (BILLPOS.BTCOST_ID) = 51
OR (BILLPOS.BTCOST_ID) = 52
 
Hallo MDDaniel,

vielen dank für deinen Tipp.

Ja, ja, die Klammern:mad: der Unterscheid ist nun nur noch 100 DS. Ich D A N K E Dir!
 
Werbung:
Ich habe hier noch eine ganze Menge andere Abfragen, ich bin euch wirklich sehr dankbar.
@ t-sql
Ich sammle gerade ein paar Daten zusammen, entschuldige die späte Rückmeldung
 
Zurück
Oben