SQL:从两个不同的表中计算两个不同的列

时间:2014-01-10 16:20:33

标签: sql sql-server tsql

我正在尝试获取两个不同表的资源列的不同计数,然后显示每个项目ID的比较。现在,这个查询为我提供了两个表的相同计数值。

select 
    t1.PRJCT_ID,
    count(t1.RSRC_ID) as TBL1_RSRC_CNT,
    t2.PRJCT_ID,
    count(t2.RSRC_ID) as TBL2_RSRC_CNT
from
    DATA_TABLE_1 t1
LEFT OUTER JOIN 
    DATA_TABLE_2 t2 on t1.PRJCT_ID = t2.PRJCT_ID
GROUP BY
    t1.PRJCT_ID, t2.PRJCT_ID
order by 1

3 个答案:

答案 0 :(得分:4)

当然你会得到相同的计数,你计算同一个表的列(由连接创建,授予,但它仍然是一个矩形表)。

您要做的是使用子查询。首先获取每个项目id的列表(来自表,或解析两个表的联合,但这是数据库规范化不良的标志),然后独立查询表的计数:

select p.ID,
  (select count(*) from DATA_TABLE_1 t1 where t1.ID=p.ID) Count1,
  (select count(*) from DATA_TABLE_2 t2 where t2.ID=p.ID) Count2
from projects p

答案 1 :(得分:1)

注意:我想你是某个PROJECT表。 我认为最好的方法是使用两个子查询。这样,您将拥有所有项目,甚至是那些没有任何资源的项目。就像是:

SELECT 
    p.PRJCT_ID,
    ( SELECT COUNT(*) FROM DATA_TABLE_1 t1 WHERE t1.PRJCT_ID = p.PRJCT_ID ) AS TBL1_RSRC_CNT,
    ( SELECT COUNT(*) FROM DATA_TABLE_2 t2 WHERE t2.PRJCT_ID = p.PRJCT_ID ) AS TBL2_RSRC_CNT
FROM PROJECT p
ORDER BY p.PRJCT_ID

答案 2 :(得分:-1)

您还可以使用与聚合SUM函数配对的CASE子句。

select 
    t1.PRJCT_ID,
    SUM( CASE WHEN t1.RSRC_ID IS NULL THEN 0 ELSE 1 END ) as TBL1_RSRC_CNT,
    t2.PRJCT_ID,
    SUM( CASE WHEN t2.RSRC_ID IS NULL THEN 0 ELSE 1 END ) as TBL2_RSRC_CNT
from
    DATA_TABLE_1 t1
LEFT OUTER JOIN 
    DATA_TABLE_2 t2 on t1.PRJCT_ID = t2.PRJCT_ID
GROUP BY
    t1.PRJCT_ID, t2.PRJCT_ID
order by 1