У меня есть две великолепные таблицы, которые я хотел бы использовать в качестве основы для еще большей третьей таблицы!
Выходные данные зависят от интервала дат, например, с 01.09.2010 по 09/ 03/2010
Пример вывода из ТАБЛИЦА A - - ( ALLOCATED Тестеры)
Date Country Allocated testers
09/01/2010 Nigeria 0
09/02/2010 Nigeria 1
09/03/2010 Nigeria 134
09/01/2010 China 2
09/02/2010 China 0
09/03/2010 China 14
09/01/2010 Chile 3
09/02/2010 Chile 4
09/03/2010 Chile 0
*************
Пример вывода из ТАБЛИЦА B - - ( ОТСУТСТВУЕТ Тестеры)
Date Country Absent testers
09/01/2010 Nigeria 0
09/02/2010 Nigeria 7
09/03/2010 Nigeria 0
09/01/2010 China 2
09/02/2010 China 0
09/03/2010 China 0
09/01/2010 Chile 1
09/02/2010 Chile 0
09/03/2010 Chile 0
*************
Пример вывода WANTED из ТАБЛИЦЫ C (ВЫДЕЛЕННЫЕ И ОТСУТСТВУЮЩИЕ Тестеры)
Date Country Allocated testers Absent testers
09/01/2010 Nigeria 0 0
09/02/2010 Nigeria 1 7
09/03/2010 Nigeria 134 0
09/01/2010 China 2 2
09/02/2010 China 0 0
09/03/2010 China 14 0
09/01/2010 Chile 3 2
09/02/2010 Chile 4 0
09/03/2010 Chile 0 0
И здесьнекоторый код SQL, генерирующий показанный выше вывод ... (да, они работают)
ТАБЛИЦА A
WITH Calendar AS (SELECT CAST(@StartDate AS datetime) AS Date
UNION ALL
SELECT DATEADD(d, 1, Date) AS Expr1
FROM Calendar AS Calendar_1
WHERE (DATEADD(d, 1, Date) < @EndDate))
SELECT C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM Calendar AS C CROSS JOIN
Country AS C2 LEFT OUTER JOIN
Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)
TABLE B
WITH Calendar AS (SELECT CAST(@StartDate AS datetime) AS Date
UNION ALL
SELECT DATEADD(d, 1, Date) AS Expr1
FROM Calendar AS Calendar_1
WHERE (DATEADD(d, 1, Date) < @EndDate))
SELECT C.Date, C2.Country, COALESCE (COUNT(PA.PeopleID), 0) AS [Absent testers]
FROM Calendar AS C CROSS JOIN
Country AS C2 INNER JOIN
Roles AS R INNER JOIN
People AS P ON R.RolesID = P.RolesID ON C2.CountryID = P.CountryID LEFT OUTER JOIN
PeoplesAbsence AS PA ON C.Date BETWEEN PA.StartDate AND PA.EndDate AND P.PeopleID = PA.PeopleID
WHERE (R.Role = 'Tester')
GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)
ТАБЛИЦА C - это то, что мне нужно, чтобы создать: -)
ПРИМЕЧАНИЕ. Я хотел бы увидеть пример кода, чтобы начать!
ПРИМЕЧАНИЕ ТАКЖЕ: я не хочу решать это с помощью Views в SQL Server, потому что он просто не работает ... - мне нужна эта 3-я таблица; -)
решено! получено решение от тdammers (спасибо!), и вот как это выглядит при реализации:
WITH Calendar AS (SELECT CAST(@StartDate AS datetime) AS Date
UNION ALL
SELECT
DATEADD(d, 1, Date) AS Expr1
FROM
Calendar AS Calendar_1
WHERE
(DATEADD(d, 1, Date) < @EndDate))
SELECT a.Date, a.Country, a.[Allocated testers], b.[Absent testers] FROM ( SELECT
C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM
Calendar AS C
CROSS JOIN
Country AS C2
LEFT OUTER JOIN
Requests AS R
ON
C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
GROUP BY
C.Date, C2.Country ) as a LEFT OUTER JOIN ( SELECT C.Date, C2.Country, COALESCE (COUNT(PA.PeopleID), 0) AS [Absent testers]
FROM Calendar AS C CROSS JOIN
Country AS C2 INNER JOIN
Roles AS R INNER JOIN
People AS P ON R.RolesID = P.RolesID ON C2.CountryID = P.CountryID LEFT OUTER JOIN
PeoplesAbsence AS PA ON C.Date BETWEEN PA.StartDate AND PA.EndDate AND P.PeopleID = PA.PeopleID
WHERE (R.Role = 'Tester')
GROUP BY C.Date, C2.Country ) as b ON a.date = b.date AND a.country = b.country