2012-09-10 2 views
0

Ok, voici ce que je veux faire. J'ai trop simplifié l'exemple ci-dessous: -SQL Select Puzzle

J'ai une table (tableau 1) avec des références dans comme ceci:

Table1_ID (PK)

Table1_ID Description de

Il y a une autre table (Table2): -

Table2_ID (PK)

Table2_LinkedID (FK)

Table2_Status < --value est "ouvert" ou "compléter"

Table2_LinkedID est lié à Table1_ID.

Ok. Maintenant, j'ai trois requêtes que je veux connecter ensemble. Voici ce dont j'ai besoin.

Première requête: -

SELECT * FROM Table1 

Cela fonctionne très bien.

Je souhaite ajouter deux colonnes supplémentaires à la requête. Le premier est le nombre total d'enregistrements dans Table2 où la clé étrangère est égale à la clé primaire de table1 (c'est-à-dire SELECT *).

Le second sera un nombre d'enregistrements où Table2_Status = « terminé »

Est-ce que ce sens?

Répondre

2
select t1.Table1_ID, 
    t1.Table1_Description, 
    t2.TotalCount, 
    t2.CompletedCount 
from Table1 t1 
left outer join (
    select Table2_LinkedID, 
     count(*) as TotalCount, 
     count(case when Table2_Status = 'completed' then 1 end) as CompletedCount 
    from Table2 
    group by Table2_LinkedID 
) t2 on t1.Table1_ID = t2.Table2_LinkedID 
+0

Great stuff. J'ai utilisé cela comme base de ma solution et cela fonctionne parfaitement. A appris quelque chose de nouveau, aussi - n'avait jamais rencontré le cas lorsque la syntaxe avant .. –

1
SELECT t1.*, 
(SELECT COUNT(*) FROM Table2 WHERE Table2_LinkedID = t1.ID) cntTotal, 
(SELECT COUNT(*) FROM Table2 WHERE Table2_LinkedID = t1.ID AND Table2_Status = 'completed') cntCompleted 
FROM Table1 t1 

Assurez-vous d'avoir un indice approprié pour la clé étrangère et Table2_Status pour une meilleure performance.

1

Vous pouvez faire un GROUP BY simple avec des agrégats:

SELECT 
Table1.ID, 
Table1.Description, 
Count(Table2.ID) AS TotalT2, 
Sum(CASE WHEN Table2.Status = 'completed' THEN 1 ELSE 0 END) AS CountOfCompleted 
FROM Table1 
LEFT JOIN Table2 ON Table2.LinkedID = Table1.ID 
GROUP BY Table1.ID, Table1.Description 
0

Est-ce que ce travail pour vous?

Requête 1:

select a.ID 
     , count(1) as Table2_RecordCount 
from Table1 a 
inner join Table2 b on b.LinkedID = a.ID 
group by a.ID 

Requête 2:

select a.ID 
     , count(1) as Table2_RecordCount 
from Table1 a 
inner join Table2 b on b.LinkedID = a.ID 
where b.[Status] = 'completed' 
group by a.ID