Как мне создать третью таблицу из двух таблиц? - PullRequest
1 голос
/ 13 августа 2010

У меня есть две великолепные таблицы, которые я хотел бы использовать в качестве основы для еще большей третьей таблицы!

Выходные данные зависят от интервала дат, например, с 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

1 Ответ

2 голосов
/ 13 августа 2010

Таблица C должна быть не таблицей, а представлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...