2014-06-10 5 views
0

Ok - j'espère que quelqu'un pourra m'aider alors que je me bats ici. J'ai essayé d'utiliser sum (cas quand), count (*), sous-requêtes sans succès. Essentiellement, j'ai deux requêtes que j'essaie de combiner en une, regroupées par le même paramètre. Les requêtes:Combiner deux comptes avec des jointures dans une requête

Requête 1:

SELECT 
u.username, 
count(*) as 'Total' 

FROM log1 L1 
JOIN users u on u.userref = L1.userref 
WHERE L1.date between @FromDate and @ToDate 
GROUP BY u.username 
ORDER BY u.username 

Requête 2:

SELECT 
u.username, 
count(*) as 'Total' 

FROM log2 L2 
LEFT JOIN users u on u.userref = L2.userref 
WHERE L2.date between @FromDate and @ToDate and L2.message like '%None%' 
GROUP BY u.username 
ORDER BY u.username 

Ce que je voudrais une seule requête avec une colonne de nom d'utilisateur (u.username), une colonne indiquant les résultats de la requête 1, et une colonne montrant les résultats de la requête deux. Toute aide appréciée!

Répondre

1

Vous pouvez mettre une déclaration de cas dans la fonction de comptage à ne compter lorsque certains critères sont remplis:

SELECT u.username, 
     Total = COUNT(*), 
     Total2 = COUNT(CASE WHEN L.message LIKE '%None%' THEN 1 END) 
FROM log1 AS L 
     JOIN users AS u 
      ON u.userref = L.userref 
WHERE L.date BETWEEN @FromDate and @ToDate 
GROUP BY u.username 
ORDER BY u.username; 

à noter:

EDIT

Complètement manqué que vous avez eu deux tables de journaux distincts:

SELECT u.username, 
     Total = COUNT(Count1), 
     Total2 = COUNT(Count2) 
FROM ( SELECT l.UserRef, Count1 = 1, Count2 = NULL 
      FROM log1 AS L 
      WHERE L.date BETWEEN @FromDate and @ToDate 
      UNION ALL 
      SELECT l.UserRef, Count1 = NULL, Count2 = 1 
      FROM log2 AS L 
      WHERE L.date BETWEEN @FromDate and @ToDate 
      AND  L.message LIKE '%None%' 
     ) AS l 
     JOIN users AS u 
      ON u.userref = L.userref 
GROUP BY u.username 
ORDER BY u.username; 
+0

où dois-je mettre le rejoindre pour log2? – Mato

+0

Désolé, raté qu'ils étaient des tables différentes. J'ai ajouté une solution alternative. – GarethD

0
  SELECT X.USERNAME,X.TOTAL,Y.TOTAL 
    FROM(SELECT 
      u.username, 
      count(*) as 'Total' 
      FROM log1 L1 
      JOIN users u on u.userref = L1.userref 
      WHERE L1.date between @FromDate and @ToDate 
      GROUP BY u.username 

      ) as x 
INNER JOIN 
      (
      SELECT 
      u.username, 
      count(*) as 'Total' 
      FROM log2 L2 
      LEFT JOIN users u on u.userref = L2.userref 
      WHERE L2.date between @FromDate and @ToDate and L2.message like '%None%' 
      GROUP BY u.username 
      ) AS Y ON Y.USERNAME = X.USERNAME 
+0

"Syntaxe incorrecte près du mot-clé" SELECT "" pour une raison quelconque ... – Mato

+0

trouvé la virgule manquante, mais maintenant il ne ressemble pas à la dernière ligne – Mato

+0

@mato que voulez-vous dire, il ne ressemble pas à la dernière ligne? – gh9

Questions connexes