Ikarus
Ikarus

Reputation: 11

Reducing SQL code in ms access using a loop

I want to automize a SQL query in MS Access. I am new to vba and it would be great if someone can help me with my problem:

I need to generate a list for my company with each employee who has worked for a specific team. Each team gets a list that includes the working hours that have been done for a specific project. Here is the sql-code for one team:

SELECT 
    Sum(b.Stunden) AS Gesamtstunden, 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, 
    Team.Teamleader, b.Positionen.Position_ID, b.Positionen.Art
FROM
    (SELECT * 
     FROM 
          (SELECT * 
           FROM Leistungen 
           INNER JOIN Kostengefässe ON Leistungen.Kostengefäss_ID = Kostengefässe.Kostengefäss_ID) AS a 
     INNER JOIN 
         Positionen ON a.Position_ID = Positionen.Position_ID) AS b 
INNER JOIN 
    Team ON b.Team_ID = Team.Team_ID
WHERE 
    (((b.Mitarbeiter) = 'HBI') AND (Team.Team_ID) = '2_RR1')
GROUP BY 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, 
    b.Positionen.Position_ID, b.Positionen.Art

UNION

SELECT 
    Sum(b.Stunden) AS Gesamtstunden, 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, 
    b.Positionen.Position_ID, b.Positionen.Art
FROM
    (SELECT * 
     FROM 
         (SELECT * 
          FROM Leistungen 
          INNER JOIN Kostengefässe ON Leistungen.Kostengefäss_ID = Kostengefässe.Kostengefäss_ID) AS a 
     INNER JOIN 
         Positionen ON a.Position_ID = Positionen.Position_ID) AS b 
INNER JOIN 
    Team ON b.Team_ID = Team.Team_ID
WHERE 
    (((b.Mitarbeiter) = 'LBR') AND (Team.Team_ID) = '2_RR1')
GROUP BY 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, 
    b.Positionen.Position_ID, b.Positionen.Art

UNION

SELECT 
    Sum(b.Stunden) AS Gesamtstunden, 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, 
    b.Positionen.Position_ID, b.Positionen.Art
FROM 
    (SELECT * 
     FROM 
         (SELECT * 
          FROM Leistungen 
          INNER JOIN Kostengefässe ON Leistungen.Kostengefäss_ID = Kostengefässe.Kostengefäss_ID) AS a 
     INNER JOIN 
         Positionen ON a.Position_ID = Positionen.Position_ID) AS b 
INNER JOIN 
    Team ON b.Team_ID = Team.Team_ID
WHERE 
    (((b.Mitarbeiter) = 'PJO') AND (Team.Team_ID) = '2_RR1')
GROUP BY 
    b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, 
    b.Positionen.Position_ID, b.Positionen.Art

As you can see, I have multiple queries which I unite using the UNION. I want to reduce these queries using a loop for one single sql with the employee as a variable and loop through all employees. Any ideas?

Upvotes: 1

Views: 42

Answers (1)

sagi
sagi

Reputation: 40471

You can simply use the IN condition instead of '='.

SELECT Sum(b.Stunden) AS Gesamtstunden, b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, b.Positionen.Position_ID, b.Positionen.Art
FROM (SELECT * FROM (SELECT * FROM Leistungen INNER JOIN Kostengefässe ON Leistungen.Kostengefäss_ID = Kostengefässe.Kostengefäss_ID)  AS a INNER JOIN Positionen ON a.Position_ID = Positionen.Position_ID)  AS b INNER JOIN Team ON b.Team_ID = Team.Team_ID
WHERE (((b.Mitarbeiter) in('HBI','LBR','PJO')) And (Team.Team_ID)='2_RR1')
GROUP BY b.Mitarbeiter, b.Leistungen.Kostengefäss_ID, Team.Teamleader, b.Positionen.Position_ID, b.Positionen.Art

Your code was hard to read, so I hope I saw all the differences between those 3 queries ('HBI','LBR','PJO')? BTW - you use a lot of unnecessary '()'

Upvotes: 1

Related Questions