2016-10-13 1 views
0

Ich habe Code, den ich von der Zugriffssprache zu SQL konvertieren möchte. Ich habe das Instrument bereits zu Charindex konvertiert, muss nur das Mid-Stück konvertieren. Der Code nimmt grundsätzlich ein Feld, das eine E-Mail-Adresse enthält, die immer [email protected] formatiert ist und zwei Spalten eins mit dem Vornamen und eins mit dem Nachnamen macht. Hier ist der Code:Konvertieren Sie Zugriff Mitte zu SQL-Teilzeichenfolge

SELECT sap.Description, Sum(main.Hours) AS SumOfHours, 
    substring(supervisor1email, 1, charindex('.', supervisor1email) - 1) AS SupervisorFirstName, 
substring(supervisor1email, charindex('.', supervisor1email) + 1, charindex('@', supervisor1email) - charindex('.', supervisor1email) - 1) AS SupervisorLastName, 

(SELECT SUM(sub.hours) 

FROM v_MES_TcActivities sub 

WHERE sub.costctr='106330' 
AND sub.AttCode Not Like 'MEAL' 
AND sub.clockin Between dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) and dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 

AND substring(sub.supervisor1email, 1, charindex('.', sub.supervisor1email) - 1) = substring(main.supervisor1email, 1, charindex('.', main.supervisor1email) - 1) 

AND substring(sub.supervisor1email, charindex('.', sub.supervisor1email) + 1, charindex('@', sub.supervisor1email) - charindex('.', sub.supervisor1email) - 1) = substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 

) AS TotalHours 

FROM v_MES_TcActivities AS main 
LEFT JOIN t_SAP_AttCodes AS sap 
ON main.AttCode = sap.Code 

WHERE main.AttCode Not Like 'MEAL' 
AND main.CostCtr Like '106330' 
AND main.ClockIn Between dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) and dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 

GROUP BY sap.Description, substring(main.supervisor1email, 1, charindex('.', main.supervisor1email) - 1), substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 

ORDER BY substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 

EDIT: Hier ist der gesamte Code

Antwort

1

Solange Sie die drei Argumente für substring angeben (wie Sie bereits für MID getan haben), sollten Sie in der Lage sein, einfach wechseln den Funktionsnamen selbst und führen Sie die Abfrage aus. Oh, und wenn dies SQL Server ist, muss auch LEFT in substring konvertiert werden.

SELECT 
    sap.Description, Sum(main.Hours) AS SumOfHours,  
    substring(supervisor1email, 1, charindex('.', supervisor1email) - 1) AS SupervisorFirstName, 
    substring(supervisor1email, charindex('.', supervisor1email) + 1, charindex('@', supervisor1email) - charindex('.', supervisor1email) - 1) AS SupervisorLastName 

EDIT: Hier ist ein funktionierendes Mock-up, einschließlich Blinddaten

create table v_MES_TcActivities 
(
supervisor1email varchar(100), 
AttCode varchar(100), 
Hours decimal(18,8), 
costctr varchar(100), 
clockin datetime default getdate() 
); 

create table t_SAP_AttCodes 
(
Code varchar(100), 
Description varchar(100) 
); 


insert into t_SAP_AttCodes (Code, Description) values ('NON-MEAL', 'not a meal'); 

insert into v_MES_TcActivities (supervisor1email, AttCode, costctr, Hours, clockin) values ('[email protected]', 'NON-MEAL', '106330', 2, dateadd(hh, -2, getdate())); 

Und hier ist die genaue Abfrage von oben (formatiert):

SELECT 
    sap.Description, Sum(main.Hours) AS SumOfHours, 
    substring(supervisor1email, 1, charindex('.', supervisor1email) - 1) AS SupervisorFirstName, 
    substring(supervisor1email, charindex('.', supervisor1email) + 1, charindex('@', supervisor1email) - charindex('.', supervisor1email) - 1) AS SupervisorLastName, 
    (
     SELECT SUM(sub.hours) 
     FROM v_MES_TcActivities sub 
     WHERE sub.costctr='106330' AND sub.AttCode Not Like 'MEAL' 
     AND sub.clockin Between dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) and dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
     AND substring(sub.supervisor1email, 1, charindex('.', sub.supervisor1email) - 1) = substring(main.supervisor1email, 1, charindex('.', main.supervisor1email) - 1) 
     AND substring(sub.supervisor1email, charindex('.', sub.supervisor1email) + 1, charindex('@', sub.supervisor1email) - charindex('.', sub.supervisor1email) - 1) = substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 
    ) AS TotalHours 
FROM v_MES_TcActivities AS main 
LEFT JOIN t_SAP_AttCodes AS sap 
ON main.AttCode = sap.Code 
WHERE main.AttCode Not Like 'MEAL' 
AND main.CostCtr Like '106330' 
AND main.ClockIn Between dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) and dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
GROUP BY sap.Description, substring(main.supervisor1email, 1, charindex('.', main.supervisor1email) - 1), substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 
ORDER BY substring(main.supervisor1email, charindex('.', main.supervisor1email) + 1, charindex('@', main.supervisor1email) - charindex('.', main.supervisor1email) - 1) 

Und die Ergebnisse, die den geparsten Vor-/Nachnamen anzeigen:

enter image description here

Die Abfrage analysiert offensichtlich die E-Mail korrekt, also denke ich, dass Ihre ursprüngliche Frage zur Verwendung von substring ziemlich gut beantwortet wird. Wenn Sie immer noch Probleme mit der Ausführung Ihrer Abfrage haben, sollten Sie sich die Daten in den Tabellen genau ansehen, um herauszufinden, ob einige Werte nicht dem Muster "[email protected]" entsprechen oder ob Sie andere Hilfe benötigen Mit dem SQL sollten Sie es als separate Frage stellen. Viel Glück!

+0

Ich erhalte einen Fehler, der besagt, dass ungültige Parameter an die LINKS- oder SUBSTRING-Funktion übergeben wurden. Irgendeine Idee hat das vielleicht? – Michael

+0

ist dieser SQL Server? Wenn ja, müssen Sie die Teilzeichenfolge überall verwenden (anstelle von LEFT, MID, RIGHT). Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln. – SlimsGhost

+0

Ich bekomme immer noch den gleichen Fehler. Sollte ich diesen "1" Wert erhöhen? – Michael