单个查询中多个表中的多个COUNT SELECTS

时间:2013-09-24 09:40:33

标签: sql-server

我有不同的表4其中有网站,工作,笔记和PO。站点是位置,一个站点可以有多个作业,作业可以有多个笔记和PO,现在我想根据站点编号选择所有作业,单个查询中的笔记和PO的数量如何使用单个查询执行此操作。我使用了这个查询,但这只显示了PO计数。使用SQL-Server DB

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

请帮助,提前致谢,

3 个答案:

答案 0 :(得分:4)

这样的事情:

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

您应该能够使用任意数量的“subselect as column”模式来获取不同的计数。另一个好处是它不需要重构您的实际主查询。

列名称&连接结构不准确..你必须填补空白。

我找到了你的DB&命名惯例不明确&相当差。为什么不使用表名/别名作为限定符?这意味着您可以在不同的表中将外键列命名为相同,因此连接将非常清晰&很明显,而不是这个丑陋的黑客为他们添加前缀。

我的设计非常简单:

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

不是那么容易吗?这么简单多了?

我也不知道PO是什么,除了它容易发生冲突(使用别名,其他列,临时名称)和无法提供信息。两者都是由于它的极端短缺。

答案 1 :(得分:0)

一种方法是在表的主键上使用count(distinct ...)

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
,       ...

答案 2 :(得分:0)

我会在加入之前聚合计数,我认为这是最有效的方法:

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

顺便说一下,当你没有使用<table name>.<column name>表示法时,很难读取查询,我强烈建议对表使用别名并对所有列使用点表示法