2010-08-13 11 views
1

J'ai deux grandes tables que je voudrais utiliser comme base pour une troisième table encore plus grande!Comment créer une troisième table à partir de deux tables?

la sortie dépend de l'intervalle de date, comme 01/09/2010 - 03/09/2010

Exemple de sortie de TABLEAU A - - (ATTRIBUE testeurs)

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 

************* 

Exemple de sortie de TABLEAU B - - (ABSENT Testeurs)

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 

************* 

Exemple de sortie de WANTED TABLEAU C (ALLOUE ET ABSENTS testeurs)

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 

Et est un code SQL ici générer la sortie ci-dessus ... (oui, ils travaillent)

TABLE 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) 

TABLEAU 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) 

TABLEAU C est celui que je besoin d'aide pour créer :-)

NOTE: Je voudrais voir une sorte de code d'exemple, pour commencer!

AUSSI NOTE: Je veux ne pas résoudre ce avec des vues dans SQL Server, car juste doesnt travail ... - Je dois que 3: table rd ;-)


Résolu! A obtenu la solution de tdammers, ce qui est à quoi il ressemble quand mis en œuvre (merci!):

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 

Répondre

2

Tableau C ne doit pas être une table, mais plutôt une vue.

+0

Non, je veux que ce soit une table! –

+0

Oh attends, oublie ça. Les deux premiers ne sont pas non plus des tables, ce sont juste des requêtes sélectionnées. Je ne pense pas que vous savez réellement ce qu'est une table SQL en premier lieu. Quant à votre problème d'origine: - créer une vue de la première requête - créer une vue de la deuxième requête - utiliser un 'join' sur les deux vues pour accumuler la sortie désirée pour la requête C – tdammers

+0

OK - Je reconnais que ce sont des requêtes select! Je plaisantais juste avant. Le problème est que je veux une troisième requête de sélection, pas de vues. Comme je ne peux pas créer de vues d'eux car ils contiennent des paramètres, je dois plutôt créer des fonctions définies par l'utilisateur, et pour moi cela me semble beaucoup plus important - alors donnez-moi un conseil sur la façon dont la troisième requête devrait être conçue. arrête de parler de Views! ;-) Et je sais vraiment ce qu'est une table SQL, le problème était que je ne savais pas ce que ce n'était pas - mais merci d'avoir trié ça. Je n'appellerai plus jamais une requête select une table, je le promets! –

Questions connexes