2013-05-15 12 views
10

Ho una stored procedure in cui sto provando a selezionare tutte le colonne di una tabella Tabella 1. C'è un'altra tabella che utilizza la chiave primaria Table1 come chiave esterna. Voglio contare il numero di record in questa tabella chiave esterna con quella selezionare in questo modo:Ottenere il conteggio dei record nella tabella figlio utilizzando l'istruzione 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 

ma dà errore:

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.

Si prega di suggerire come risolvere questo problema?

risposta

21

Prova:

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 

per ordinare utilizzando la nuova colonna

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 

fornito colonna NameLang1 e VacancyCount sono dello stesso tipo di dati.

+1

Possiamo ordinare da risultati utilizzando conteggio? – DotnetSparrow

+0

Sì ... certo ... U può aggiungere 'VacancyCount desc' o' VacancyCount asc'. – TechDo

+0

techdo: Sto provando questo ordine per \t CASE QUANDO @OrderByParam = 1 THEN NomeLang1 ELSE VacancyCount END ma dice colonna non valida VacancyCount – DotnetSparrow

2

È necessario elencare ogni colonna nella clausola GROUP BY
Queste colonne sono quelle nel bit SELECT *.

Questo sarebbe comunque l'ANSI SQL corretto.

SELECT * sé è male comunque: è sempre meglio elencare esplicitamente le colonne

2

Stai facendo il raggruppamento sbagliato. È necessario utilizzare tutte le colonne della Tabella 1 in SELECT invece di '*' e anche nella clausola GROUP BY.

Oppure si può provare un approccio diverso come questo:

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

Possiamo ordinare per risultati usando cnt? – DotnetSparrow

+0

Ovviamente, diventa una colonna ordinaria quando viene incapsulata come subquery e può essere utilizzata in qualsiasi clausola (incluso order by). – ZZa

+0

Sto usando la risposta techdo ma quando uso Order by \t CASE WHEN @OrderByParam = 1 THEN NomeLang1 ELSE VacancyCount END dice colonna invalid VacancyCount – DotnetSparrow

0

Prova in questo modo includono lista colonna nel gruppo da

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 
Problemi correlati