T-SQL - 来自两个表的DISTINCT和COUNT

时间:2014-11-12 14:22:09

标签: sql sql-server tsql sql-server-2012

我有两张桌子 - 如下所示

_permissions

project_id | project_name | something_else
------------------------------------------
19         | name here    | lksdjlskdfj
19         | name here    | dflkdkglfkg
19         | name here    | lksdjlskdfj
20         | name here!!  | dflkdkglfkg

簿

project_id | name
-----------------
19         | A
19         | B
19         | C
20         | D
20         | E

我希望查询的结果集是

结果

project_id | project_name | count
------------------------------------------
19         | name here    | 3
20         | name here!!  | 2

这是我最接近但没有用的。请指教!在上面的例子中,它吐出了9和2的计数

SELECT DISTINCT p.project_id,p.project_name,count(w.project_id)
FROM _permissions as p
    LEFT OUTER JOIN workbooks AS w
        ON p.project_id = w.project_id
GROUP BY p.project_id,p.project_name
ORDER BY p.project_name

如果出于性能目的,我宁愿使用JOINs

有一个项目表,唯一有用的列是ID

项目

id | name
----------------
19 | name here  
20 | name here!!

2 个答案:

答案 0 :(得分:2)

这对你的桌子来说并不是一个很好的设计。您应该有一个projects表,其中包含每个项目的名称,每行只有一个项目。无论如何,你可以用你当前的设计做这样的事情:

SELECT  w.project_id,
        p.project_name,
        w.[count]
FROM (  SELECT project_id, COUNT(*) [count]
        FROM workbooks
        GROUP BY project_id) w
INNER JOIN (SELECT project_id, MIN(project_name) project_name
            FROM _permissions
            GROUP BY project_id) p
    ON w.project_id = p.project_id

使用projects表,则查询应为:

SELECT  w.project_id,
        p.project_name,
        w.[count]
FROM (  SELECT project_id, COUNT(*) [count]
        FROM workbooks
        GROUP BY project_id) w
INNER JOIN projects p
    ON w.project_id = p.project_id

答案 1 :(得分:-1)

你可能想要这个:

SELECT DISTINCT p.project_id,p.project_name,count(distinct w.name)
FROM _permissions as p
    JOIN workbooks AS w
        ON p.project_id = w.project_id
GROUP BY p.project_id,p.project_name
ORDER BY p.project_name

仅当w.name不同时才能工作。

相关问题