Mai întâi, avem următoarele probleme:
1. Care e legătura dintre tabelele QASLogInfoProba şi QASUserProba ? Cred că e vorba de QASUserName, care ar fi trebuit să fie un foreign key spre UserIdentification, dar nu poate fi, deoarece tipurile de date sunt diferite.
2. Cum se reprezintă logon şi logoff în tabela QASLogInfo, pentru că văd o singură coloană de tip datetime. Cumva QASItemType reprezintă tipul evenimentului ?
3. Ideea de a avea tabele separate "CycleTimes_L01", "CycleTimes_L02", etc este în contradicţie cu regulile de normalizare a bazelor de date. Ar fi trebuit să existe o singură tabelă CycleTimes, iar L01, L02, etc să fie nişte valori într-o coloană a acestei tabele.
Dacă am fi avut nişte tabele mai normale, query-ul putea să fie de genul următor:
SELECT UserName, ComponentName,
SUM(DurationInSeconds) as TotalDurationInSeconds
FROM Users u INNER JOIN Sessions s ON u.UserID=s.UserID
INNER JOIN CycleTimes t ON s.Station=t.Station
INNER JOIN Components c ON c.ComponentID=t.ComponentID
GROUP BY UserName, ComponentName
În condiţiile în care trebuie să lucrezi cu tabele nenormalizate, cu foreign key-uri care lipsesc şi cu informaţii care sunt ascunse ca ultimele 3 caractere dintr-o coloană, eu personal nu vreau să dau o soluţie completă pentru aşa ceva. În principiu, poţi folosi cursoare, dynamic sql şi tabele temporare ca să rezolvi orice, dar soluţia corectă porneşte de la o structură sănătoasă a bazei de date şi am impresia că asta lipseşte în primul rând. Cu structura existentă, codul ar putea fi de genul următor:
DECLARE Utilizatori CURSOR FOR
SELECT UserIdentification FROM QASUserProba
WHILE 1=1 BEGIN
FETCH NEXT FROM Utilizator INTO @Utilizator
IF @@FETCH_STATUS<>0 BREAK
DECLARE Statii CURSOR FOR
SELECT QASStation FROM QASLogInfoProba WHERE QASUserName=@Utilizator
WHILE 1=1 BEGIN
FETCH NEXT FROM Statii INTO @Statie
IF @@FETCH_STATUS<>0 BREAK
DECLARE @SQL nvarchar(4000)
SET @SQL='
INSERT INTO #Temp
SELECT '''+@Utilizator+''', '''+@Statie+''', NumeComponenta, SUM(timeInWsSeconds)
FROM CycleTimes_'+@Statie+' WHERE QASStation='''+@Statie+''' AND ???
GROUP BY NumeComponenta
'
EXEC (@SQL)
END
END
Evident, codul de mai sus e incomplet, vulnerabil la SQL Injection, neperformant şi într-un cuvânt, groaznic. Cel mai bine e să corectezi structura bazei de date, chiar dacă poţi să-l completezi ca să fie acceptabil.
Răzvan