2010-11-30 8 views
1

Mon problème est que j'ai une instruction Select qui a une clause where qui est générée à la volée. Il est joint à travers 5 tables.Compte SQL sur plusieurs jointures avec dynamique O WH

J'ai fondamentalement besoin d'un nombre de chaque instance DISTINCT d'un ID utilisateur dans le tableau 1 qui tombe dans la portée de la WHERE. Cela doit pouvoir être exécuté dans une déclaration aussi bien. Donc, Estimement, je ne peux pas faire un GROUP BY global à cause des 4 autres tables dont j'ai besoin.

Si je pouvais obtenir une colonne qui avait le nombre qui a été dupliqué là où la colonne de clé primaire est ce serait parfait. c'est en ce moment ce que je regarde comme ma requête:

SELECT * 
FROM TBL1 1 
     INNER JOIN TBL2 2 On 2.FK = 1.FK 
     INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
     LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE 1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00' 
ORDER BY 
     4.Column 
     , 3.Column 
     , 3.Column2 
     , 1.Date_Time_In DESC 

Ainsi, au lieu de sélectionner toutes les colonnes, je vais filtrer à environ 5 ou 6, mais avec ce que je besoin de quelque chose comme une colonne totale est le nombre distinct de clé primaire TBL1 qui applique la clause WHERE qui a une possibilité de croissance et de réduction de la taille. Je souhaiterais presque qu'il y avait un moyen d'appliquer la même clause WHERE à un sous-ensemble parce que je réalise que cela fonctionnerait mais je ne connais pas d'autre moyen que de créer une variable et de la placer dans les deux endroits que je peux. Je fais non plus.

+1

Quelle est votre db? – jira

+0

FK est votre clé primaire? Si oui, pourquoi ne pouvez-vous pas vous grouper? En plus, vous pouvez regrouper par plus de 1 clé – Mikhail

+0

Le regroupement m'oblige à restreindre les données. Si je pouvais regrouper, je le ferais, mais cela signifie que je n'ai qu'une seule ligne basée sur ce groupe et que j'ai besoin de plusieurs résultats. une colonne et persister cette valeur à travers le nombre de résultats multiples. – Evidica

Répondre

1

Si vous utilisez SQL Server 2005 ou plus, vous pouvez utiliser l'une des fonctions AGGREGATE OVER.

SELECT * 
     , COUNT(UserID) OVER(PARTITION BY UserID) AS 'Total' 
FROM TBL1 1 
     INNER JOIN TBL2 2 On 2.FK = 1.FK 
     INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
     LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE 1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00' 
ORDER BY 
     4.Column, 3.Column, 3.Column2, 1.Date_Time_In DESC 
+0

Vous, monsieur, êtes génial. J'aime trouver des choses comme ça que je n'ai jamais utilisées/vues auparavant. – Evidica

+0

Thx, appréciez le vote de confiance mais si vous voulez impressionnant, jetez un oeil sur les affichages de Quassnoi. http://stackoverflow.com/search?tab=newest&q=user%3a55159 –

0

quelque chose comme l'ajout:

inner join (select pk, count(distinct user_id) from tbl1 WHERE Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00') as tbl1too on 1.PK = tbl1too.PK 
+0

Cela fonctionnerait techniquement cependant, mon problème ici est que lorsque le WHERE change sur l'instruction externe comment l'appliquer à la sous-requête en utilisant SQL straing. Par programme, la clause WHERE est ajoutée à la fin en fonction d'autres sélections par l'utilisateur. – Evidica

Questions connexes