使用select语句计算子表中的记录数

Dot*_*row 15 sql t-sql sql-server sql-server-2008 sql-server-2008-r2

我有一个存储过程,我试图选择表的所有列表1.还有另一个表使用Table1主键作为外键.我想用这个选择计算这个外键表中的记录数,如下所示:

SELECT *, count(*) VacancyCount
    FROM Table1 hc
    LEFT JOIN Table2 hv
    on hc.CompanyID = hv.CompanyID  
    WHERE hc.Deleted = 0
    group by hc.CompanyID
    ORDER BY NameLang1
Run Code Online (Sandbox Code Playgroud)

但它给出了错误:

列'dbo.Table1.NameLang1'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

请建议如何解决这个问题?

Tec*_*hDo 32

请试试:

select 
    *,
    (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID) VacancyCount
from Table1 hc
where
    hc.Deleted = 0
order by hc.NameLang1, VacancyCount desc
Run Code Online (Sandbox Code Playgroud)

使用新列进行排序

select * from(
    select 
        *,
        CONVERT(NVARCHAR(100), (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID)) VacancyCount
    from Table1 hc
    where
        hc.Deleted = 0
)x
Order by CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END
Run Code Online (Sandbox Code Playgroud)

提供列NameLang1VacancyCount具有相同的数据类型.


ZZa*_*ZZa 6

You're doing grouping wrong. You need to use all the columns from Table 1 in SELECT instead of '*' and in GROUP BY clause as well.

Or you can try a different approach like this:

SELECT *
FROM Table1 hc
LEFT JOIN (SELECT CompanyID, COUNT(*) cnt FROM Table2 GROUP BY CompanyID) hv
on hc.CompanyID = hv.CompanyID  
WHERE hc.Deleted = 0
ORDER BY NameLang1
Run Code Online (Sandbox Code Playgroud)