比较2个表中的2列与DISTINCT值

时间:2013-09-13 02:52:36

标签: sql

我现在正在创建一个智能视觉业务的报告服务。

我尝试计算在org_id下创建了多少用户。

但报告包含多个org_id。而且我很难计算在特定的org_id下创建了多少。

TBL_USER

USER_ID

0001122
0001234 
ABC9999         
DEF4545
DEF7676

TBL_ORG

ORG_ID

000
ABC
DEF

预期输出

TBL_RESULT

USER_CREATED

000 - 2
ABC - 1
DEF - 2

在我的理解中,我需要嵌套SELECT,但到目前为止,我已经没有了。

SELECT COUNT(TBL_USER.USER_ID) AS Expr1
FROM TBL_USER INNER JOIN TBL_ORG 
WHERE TBL_USER.USER_ID LIKE 'TBL_ORG.ORG_ID%')

这是完全错误的。但我希望它可以给我们提供线索。

1 个答案:

答案 0 :(得分:0)

看起来USER_ID值是ORG_ID的串联,以使其成为唯一。我假设这是来自COTS产品而且人类不会建造任何东西。

您希望了解部门有多少条目。在SQL中,当您在需求中读取单词by时,这意味着分组。您要采取的操作是获取计数,保留字为COUNT。除非你需要TBL_ORG以外的东西,否则我认为没有必要加入它

SELECT
    LEFT(T.USER_ID, 3) AS USER_CREATED
,   COUNT(1) AS GroupCount
FROM
    TBL_USER AS T
GROUP BY
    LEFT(T.USER_ID, 3)

任何不在聚合中的内容(COUNT,SUM,AVG等)必须在您的GROUP BY中。

SQLFiddle

我更新了小提琴,还展示了如果你需要该表中行的元素,你可以如何链接到TBL_ORG。

-- Need to have the friendly name for an org
-- Now we need to do the join
SELECT
    LEFT(T.USER_ID, 3) AS USER_CREATED
,   O.SOMETHING_ELSE
,   COUNT(1) AS GroupCount
FROM
    TBL_USER AS T
    -- inner join assumes there will always be a match
    INNER JOIN
        TBL_ORG AS O
        -- Using a function on a column is a performance killer
        ON O.ORG_ID = LEFT(T.USER_ID, 3)
GROUP BY
    LEFT(T.USER_ID, 3)
,   O.SOMETHING_ELSE;