2016-01-29 12 views
5

Tutaj w mojej aplikacji mam problemy i listę osób, które stanęły przed nimi. Dziś mam zdobycie wszystkich ludzi poprzez STUFF nazwy funkcji jak poniżej próbki:Jak odzyskać licznik podobny do Facebooka za pomocą SQL Server?

select problem.*, 
(
    STUFF 
    (
     (
      SELECT TOP(3)', ' + person.name 
      FROM 
       problem_person 
       LEFT JOIN person ON problem_person.personId = person.Id 
      WHERE 
       problem_person.problemId = problem.Id 
       order by person.name 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' 
    ) 
) as peopleWhoFaced from problem 

Jednak, gdy wiele osób zmierzyć się z tym samym problemem, peopleWhoFaced pole dostaje ogromne. Jak odzyskać coś w rodzaju Person 1, Person 2 and 36 more faced the problem? Wiem, że mogę to zrobić na poziomie interfejsu API, ale staram się tego unikać i utrzymywać kod API w czystości.

Jak mogę to zrobić? Czy będę potrzebował kursora lub czegoś w tym stylu?

Z góry dziękuję.

Odpowiedz

4

Dołącz COUNT(*) - 3:

DECLARE @count int = (SELECT COUNT(*) - 3 
         FROM problem 
         LEFT JOIN person 
         ON problem.problemId = person.problemId 
         INNER JOIN 
         problem_person 
         ON problem_person.personId = person.Id) 


select problem.*, 
(
    STUFF 
    (
     (
      SELECT TOP(3)', ' + person.name 
      FROM 
       problem_person 
       LEFT JOIN person ON problem_person.personId = person.Id 
      WHERE 
       problem_person.problemId = problem.Id 
       order by person.name 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' 
    ) + CASE WHEN @count > 0 THEN N' and ' + CAST(@count as NVARCHAR(20)) + N' more faced the problem' ELSE N'' END 
) as peopleWhoFaced from problem 
+0

Dziękuję za odpowiedź Dan! Sprawdzę to! –

+0

Odpowiedź jest niepoprawna, ale wskazała mi właściwy kierunek. To nie jest w pełni poprawne, ponieważ '@ count' zawsze zwraca tę samą liczbę osób (w moim przypadku 144 osoby), nawet gdy tylko 4 napotkało problem (poprawna wartość). –

+0

Widzę, co mówisz - zaktualizowaną odpowiedź, aby dołączyć właściwą tabelę/warunki. –

Powiązane problemy