2013-09-24 4 views
2

J'ai différents tableau 4 d'entre eux sont le site, le travail, les notes et PO. Site est l'emplacement et un site peut avoir plusieurs emplois, le travail peut avoir plusieurs notes et POs, maintenant j'aime sélectionner tout le travail sur la base du numéro de site avec le nombre de notes et POs dans une seule requête comment puis-je le faire avec une seule requête . J'ai utilisé cette requête mais cela montre le nombre de PO seulement. Utilisation de SQL-Serveur DBCOUNT SELECTS plusieurs des tables multiples dans une seule requête

SELECT jobid, job_title, po_id, count(po.po_id) PO_count, count(notes) note_count 
FROM notes 
LEFT JOIN job ON jobid = notes_job_id 
LEFT JOIN po ON po_job_id = job_id 
LEFT JOIN site_detail ON site_id = _job_si_id 
LEFT JOIN site_list ON sitelist_id = site_sitelist_id 
WHERE site_id = 116291 
GROUP BY jobid, job_title, po_id 

S'il vous plaît aider, Merci à l'avance,

Répondre

4

Quelque chose comme ceci:

select jobid, job_title, 
    (select count(po.po_id) from po where po.po_job_id=jobid) as PO_count, 
    (select count(note.id) from notes where notes.notes_job_id=jobid) as note_count, 
from job 
where site_id = 116291 

Vous devriez être en mesure d'utiliser n'importe quel nombre de modèles 'subselect as column', pour aller chercher les différences nombre d'ent. Une autre bonne chose à ce sujet est qu'il ne nécessite pas de restructuration de votre requête principale réelle.

Les noms de colonne & structure de jointure ne sont pas exacts. Vous devez remplir les espaces.

J'ai trouvé vos conventions de nommage DB & peu claires & plutôt pauvres. Pourquoi n'utilisez-vous pas les noms de tables/alias comme qualificatifs? Cela signifierait que vous pourriez nommer les colonnes de clés étrangères de la même manière dans des tables différentes, donc les jointures seraient très claires, plutôt que ce vilain hack de les préfixer.

Je conçois très simplement:

notes.FK_JOB  -> job.ID 
po.FK_JOB   -> job.ID 
site_jobs.FK_SITE -> site.ID 
site_jobs.FK_JOB -> job.ID 

est-ce pas & facile tellement plus simple?

Je n'ai également aucune idée de ce qu'est un PO, sauf qu'il est à la fois sujet aux conflits (avec des alias, d'autres colonnes, des noms temporaires) et non informatif. Les deux en raison de son extrême courtesse.

+0

PO est en fait la commande d'achat et c'est le nom de la table – NoNaMe

+0

C'est ce que je devinais pourrait être possible .. Si la commande est ORDRE, je suggère PurchaseOrder pourrait être PORDER. "PO", en tant que nom très court, est extrêmement général et proéminent dans l'espace de noms - donc plus susceptible de créer un conflit (avec des alias, d'autres colonnes ou des noms temporaires). C'est aussi moins informatif et clair que ne le serait PORDER. –

0

Une façon est d'utiliser count(distinct ...) sur la clé primaire de la table:

SELECT jobid 
,  job_title 
,  count(distinct po.po_id) po_count 
,  count(distinct site.site_id) site_count 
,  count(distinct note.note_id) note_count 
,  ... 
0

je des chiffres agrégés avant rejoindre, je pense que c'est la façon la plus efficace:

select 
    j.jobid, j.job_title, po.po_count, 
    ... 
from job as j 
    left outer join (
     select count(*) as po_count, po.po_job_id 
     from po as po 
     group by po.po_job_id 
    ) as po on po.po_job_id = j.job_id 
    ... 
where j.site_id = 116291 

BTW il est vraiment difficile de lire requête lorsque vous ne l'utilisez <table name>.<column name> notation, je vous recommande fortement d'utiliser des alias pour les tables et d'utiliser la notation par points pour toutes les colonnes

+0

Appuyé sur le '. 'notation. Comme il essaie de sélectionner des Jobs avec des comptes de (Job.Notes) et (Job.PurchaseOrders), les comptes comme sous-requêtes dans la clause SELECT ne seraient-ils pas les plus simples? Cela ne nécessite aucune jointure ou regroupement, juste des sous-requêtes. –

Questions connexes