2013-05-15 9 views
10

Mam procedurę składowaną, w której próbuję wybrać wszystkie kolumny tabeli. Tabela 1. Istnieje inna tabela, która używa klucza podstawowego Table1 jako klucza obcego. Chcę policzyć liczbę rekordów w tej tabeli klucza obcego z tym wybrać tak:Uzyskiwanie liczby rekordów w tabeli podrzędnej przy użyciu instrukcji select

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 

ale daje błąd:

Column 'dbo.Table1.NameLang1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Proszę sugerują, jak to naprawić?

Odpowiedz

21

Spróbuj:

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 

zamawiania stosując nową kolumnę

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 

Pod kolumnę NameLang1 i VacancyCount są tego samego typu danych.

+1

możemy zamówić przez liczbę korzystających z wyników? – DotnetSparrow

+0

Tak ... na pewno ... U można dodać 'VacancyCount desc' lub' VacancyCount asc'. – TechDo

+0

Techdo: Próbuję tego zamówienia przez \t CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END, ale mówi nieprawidłowa kolumna VacancyCount – DotnetSparrow

2

Będziesz musiał wyświetlić każdą kolumnę w klauzuli GROUP BY
Te kolumny są kolumnami w bicie SELECT *.

To byłby poprawny ANSI SQL mimo to.

sama SELECT * jest źle i tak: to jest zawsze lepiej, aby wyraźnie wymienić kolumny

2

Robisz zgrupowanie źle. Musisz użyć wszystkich kolumn z Tabeli 1 w SELECT zamiast "*" oraz w klauzuli GROUP BY.

Albo można spróbować innego podejścia takiego:

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 
+0

Czy możemy dokonać zamówienia według wyników za pomocą cnt? – DotnetSparrow

+0

Oczywiście staje się zwykłą kolumną, gdy jest zawinięty jako podzapytanie i może być użyty w dowolnej klauzuli (w tym w kolejności). – ZZa

+0

Używam odpowiedzi Techdo, ale kiedy używam Zlecenia przez \t CASE KIEDY @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END mówi niepoprawną kolumnę VacancyCount – DotnetSparrow

0

Spróbuj w ten sposób zawierać listę kolumn w grupie przez

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 
Powiązane problemy