2013-07-11 14 views
69

Wiem, że w serwerze sql nie możemy użyć funkcji Group_concat, ale tutaj jest jeden problem, w którym muszę Group_Concat moje zapytanie.Jeszcze go znaleźć, ale nie jest w stanie poprawne zapytanie SQL it.My jestJak utworzyć kwerendę z group_concat w serwerze sql

select m.maskid,m.maskname,m.schoolid,s.schoolname, 
md.maskdetail 
from tblmask m join school s on s.id = m.schoolid 
join maskdetails md on m.maskid = md.maskid 
order by m.maskname ; 

daje mi prowadzić jak

enter image description here

Wystarczy spojrzeć pierwsze 3 rzędy W tym maskid, maskname, schoolid, schoolname to samo, ale maskdetail jest inny, więc chcą do jednego wiersz dla tego, w którym ostatnia kolumna może zawierać wszystkie maski danych, jak w maskid i tak dalej.

Chcę moje wyjście jak

enter image description here

i tak on.So proszę mi pomóc przy podejmowaniu zapytanie do tego.

Z góry dziękuję.

+1

Nie jest to * całkiem * duplikat pytania o SQL Server 2005 od czasu dodania ['STRING_AGG'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql) do programu SQL Server 2017, więc warto przyjrzeć się temu, jeśli jesteś pobłogosławiony ostatnim serwerem SQL. –

Odpowiedz

92

Zapytanie:

SELECT 
     m.maskid 
    , m.maskname 
    , m.schoolid 
    , s.schoolname 
    , maskdetail = STUFF((
      SELECT ',' + md.maskdetail 
      FROM dbo.maskdetails md 
      WHERE m.maskid = md.maskid 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM dbo.tblmask m 
JOIN dbo.school s ON s.ID = m.schoolid 
ORDER BY m.maskname 

Dodatkowe informacje:

String Aggregation in the World of SQL Server

+0

hmmm czy możesz wyjaśnić @Devart mam na myśli wewnętrzne sprzężenie dać wynik jak na obrazku ... tak aby połączyć we wszystkich duplikatach m.maskid , m.maskname , m.schoolid , s.schoolname do jednego wiersza potrzebujemy grupy przez –

+5

Relacja między 'tblmask' -' maskdetails' = '1 to many', więc nie powinno być tutaj duplikatów rekordów. – Devart

+0

Jaki jest powód używania 'PATH (''), TYPE' i' .value ('.', 'NVARCHAR (MAX)') tutaj, w przeciwieństwie do prostego 'PATH ('')' as w Asitwer @ AmitSingh ? Twój wariant zapewnia sposób, znacznie cięższy plan wykonania, czy ma jakąś ukrytą zaletę, aby uzasadnić koszt? Jeśli nie, czy poprawisz lub poprawisz swoją odpowiedź, skoro została zaakceptowana i ma być najlepsza? – pvgoran

19
Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , STUFF((
      SELECT ',' + T.maskdetail 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH('')), 1, 1, '') as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
Group by A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
+4

+1. Nawiasem mówiąc, "GROUP BY" nie jest tutaj potrzebne. – Devart

5

Proszę uruchomić poniższe zapytanie, nie wymaga rzeczy i GROUP BY w przypadku :

Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , CAST((
      SELECT T.maskdetail+',' 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH(''))as varchar(max)) as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
+3

STUFF jest wymagany do usunięcia pierwszego przecinka, w twoim przypadku maskdetail kończy się przecinkiem –

6

ten można także osiągnąć stosując Scalar-Valued Function w MSSQL 2008
Deklarują swoją funkcję w następujący sposób,

CREATE FUNCTION [dbo].[FunctionName] 
(@MaskId INT) 
RETURNS Varchar(500) 
AS 
BEGIN 

    DECLARE @SchoolName varchar(500)       

    SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', ' 
    FROM maskdetails MD WITH (NOLOCK)  
    AND [email protected] 

    RETURN @SchoolName 

END 

I wtedy twój ostateczny zapytanie będzie jak

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname, 
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail' 
FROM tblmask m JOIN school s on s.id = m.schoolid 
ORDER BY m.maskname ; 

Uwaga: You może trzeba zmienić funkcję, ponieważ nie znam kompletnej struktury tabeli.

+0

Zobacz także: https://gooroo.io/GoorooTHINK/Article/10001/Aggregate-String-Concatenation-in-SQL-Server-2012- like-stringagg-in-PostgreSql/5122 # .Wif5rLaZMWo – Magne

Powiązane problemy