2017-05-24 2 views
0

J'ai fait beaucoup de requêtes sur Oracle, et maintenant je travaille avec SQL Server. J'ai vu la façon d'utiliser une fonction similaire à listagg d'oracle dans sql server (stuff).SQL STUFF ne fonctionne pas, pourquoi?

Select 
    sqd.id_question, 
    STUFF((Select ',' + nm_departament from tb_departament where sqd.id_departament = id_departament for xml path('')),1,1,'') nm_departements 
from 
    tb_survey_question_departament sqd 

La sintaxe est correcte, mais pas le résultat.

Notice the records related to id 1

L'objectif est d'avoir par exemple pour les 2 premières lignes, le résultat comme 1 - RH, Planta Brasilia

Où est le problème?

Répondre

1

Vous devez d'abord et distinct id_questioninner join à tb_departament comme celui-ci

Select 
    sqd.id_question, 
    STUFF(( 
      SELECT ',' + td.nm_departament 
      from tb_departament td 
      INNER JOIN tb_survey_question_departament sqd1 ON sqd1.id_departament = td.id_departament 
      WHERE sqd1.id_question = sqd.id_question 
      FOR XML PATH('') 
     ) 
     ,1,1,'') AS nm_departements 
from 
    (
     SELECT DISTINCT sqd.id_question 
     FROM tb_survey_question_departament sqd 
    ) sqd 
+0

Merci TRIV, vraiment ce travail que j'ai besoin. – MCunha98

0

groupe manquant par id_Question ...

Select 
sqd.id_question, 
STUFF((Select ',' + nm_departament from tb_departament where sqd.id_departament = id_departament for xml path('')),1,1,'') nm_departements 
    from 
tb_survey_question_departament sqd 
group by sqd.id_question 
+0

Non, cela ne fonctionnera pas. Cela provoquera juste une erreur à cause du groupe par (SQL ne sera pas capable de grouper le STUFF correctement comme résultat). Le problème est avec l'instruction STUFF elle-même, car elle n'est pas jointe correctement à la requête externe, mais sans voir de données d'exemple, il est difficile de recommander comment résoudre ce problème. – ZLK

+0

Oui, vous avez raison si je mets le groupe le problème est: La colonne 'tb_survey_question_departament.id_departament' n'est pas valide dans la liste de sélection car elle n'est contenue ni dans une fonction d'agrégat ni dans la clause GROUP BY. Les données ont le problème que je montre sur les deux premières lignes, c'est-à-dire que id_question a 1 ou plus id_departement associé, donc je n'ai besoin d'afficher qu'une ligne par id_question et d'agréger les 'n' départements – MCunha98

+0

@ZLK Voir cette image : https://s19.postimg.org/53ltdzb6r/Capturar.png – MCunha98

0
CREATE TABLE tblSample (
EMPNAME VARCHAR(10) 
,DEPTNAME VARCHAR(10) 
,LEAVETYPE VARCHAR(20) 
,TOTALLEAVE INT 
); 

INSERT INTO tblSample (EMPNAME, DEPTNAME, LEAVETYPE, TOTALLEAVE) 
     VALUES ('ANDREW','CSE','SICKLEAVE',3) 
      ,('GEORGE','IT','CASUALLEAVE',1) 
      ,('ANDREW','CSE','CASUALLEAVE',2) 
      ,('GEORGE','IT','SICKLEAVE',2); 

SELECT EMPNAME 
,DEPTNAME 
,STUFF((
     SELECT ',' + LEAVETYPE + '-' + CAST(TOTALLEAVE AS VARCHAR(5)) 
     FROM tblSample 
     WHERE EMPNAME = T.EMPNAME 
      AND DEPTNAME = T.DEPTNAME 
     FOR XML PATH('') 
     ), 1, 1, '') AS LEAVETYPE 
,SUM(TOTALLEAVE) AS TOTALLEAVE 
FROM tblSample T 
GROUP BY EMPNAME 
,DEPTNAME 
----------------------------------------------- 
0

Merci d'aider les gars, ici la dernière sql fonctionne très bien:

Select 
    sqd.id_question, 
    que.ds_question, 
    STUFF(( 
      SELECT ',' + td.nm_departament 
      from tb_departament td 
      INNER JOIN tb_survey_question_departament sqd1 ON sqd1.id_departament = td.id_departament 
      WHERE sqd1.id_question = sqd.id_question 
      FOR XML PATH('') 
     ) 
     ,1,1,'') AS nm_departements 
from 
    (
     SELECT DISTINCT sqd.id_question 
     FROM tb_survey_question_departament sqd 
    ) sqd 
    inner join tb_survey_question que on sqd.id_question = que.id_question