24

我有一个存储过程,我试图在其中选择表表 1 的所有列。还有另一个表使用表 1 主键作为外键。我想用这样的选择来计算这个外键表中的记录数:

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

但它给出了错误:

列“dbo.Table1.NameLang1”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

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

4

4 回答 4

49

Please try:

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

for ordering using the new column

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

Provided column NameLang1 and VacancyCount are of same datatype.

于 2013-05-15T08:47:12.423 回答
6

你做错分组了。您需要在 SELECT 而不是 '*' 和 GROUP BY 子句中使用表 1 中的所有列。

或者您可以尝试不同的方法,如下所示:

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
于 2013-05-15T08:50:40.303 回答
2

您必须列出 GROUP BY 子句中的每一列
这些列是SELECT *位中的列。

无论如何,这将是正确的 ANSI SQL。

SELECT *无论如何,它本身很糟糕:明确列出列总是更好

于 2013-05-15T08:46:12.067 回答
0

尝试以这种方式在 group by 中包含列列表

 SELECT column1,column2,column3..,NameLang1,count(*) VacancyCount
FROM Table1 hc
LEFT JOIN Table2 hv
on hc.CompanyID = hv.CompanyID  
WHERE hc.Deleted = 0
group by column1,column2,column3
ORDER BY NameLang1
于 2013-05-15T09:09:09.907 回答