【问题标题】:Concatenate rows in a single column连接单列中的行
【发布时间】:2019-07-19 08:42:20
【问题描述】:

我正在构建一个查询,我需要将一列的值连接到一行中

我使用 STRING_AGG 函数对其进行了管理,但不幸的是,我要使用存储过程的数据库不是 2017 版本,所以我正在尝试一些东西,但我无法让它工作

select w1.idQuestionario, w1.nominativo, w1.media, w1.valutazione, count(w1.risposto) as Funzionari, (stuff((select a.peso for xml path('')), 1, 0, ',')) as peso, (stuff((select a.titolo for xml path('')), 1, 0, ',')) from (
    select w.nominativo, w.idQuestionario, w.risposto, sum(w.valore) / convert(float, count(w.Domande)) as media, w.valutazione
    from (
    select u.nominativo, q.idQuestionario, q.nome, d.idDomanda as Domande,  r.peso , ur.matricola as risposto, 1 * r.peso as valore, sum(us.valutazione) / convert(float, count(us.idSezione)) as valutazione
    from Questionario q 
    join Domanda d ON d.idQuestionario = q.idQuestionario
    join Risposta r ON r.idDomanda = d.idDomanda
    join rUtenteRisposta ur ON ur.idRisposta = r.idRisposta
    join Utente u ON u.matricola = ur.matricola
    left join rUtenteSezione us ON us.idQuestionario = q.idQuestionario AND us.matricola = u.matricola
    where q.cancellato = 0
    and q.idQuestionario = '111222'
    and q.anonimo = 0
    group by u.nominativo, q.idQuestionario, q.nome, d.idDomanda, r.peso, ur.matricola
    ) w
    group by w.idQuestionario,w.risposto,w.nominativo,w.valutazione ) w1
    join (select r.peso, d.titolo as titolo, u.nominativo, r.creazione from Domanda d
    join Questionario as q ON q.idQuestionario = d.idQuestionario
    join Risposta as r ON r.idDomanda = d.idDomanda
    join rUtenteRisposta as ur on ur.idRisposta = r.idRisposta
    join utente u ON u.matricola = ur.matricola
    where q.idQuestionario = '111222'
    and q.cancellato = 0
    and q.anonimo = 0) a ON a.nominativo = w1.nominativo
    group by w1.idQuestionario, w1.media, w1.nominativo, w1.valutazione, a.peso, a.titolo, a.creazione
    order by a.creazione

我之前得到了这个结果:

column1 column2 column3 column4 column5 column6
aaaaa   bbbbb   0,2     6       1       how are you?
aaaaa   bbbbb   0,2     6       2       did you eat?
ccccc   dddddd  0,5     7       1       how are you?
ccccc   dddddd  0,5     7       1       did you eat?

现在我得到了这个:

column1 column2 column3 column4 column5 column6
aaaaa   bbbbb   0,2     6       ,<columns5>1,</columns5>       ,<columns6>how are you?,</columns6>
aaaaa   bbbbb   0,2     6       ,<columns5>1,</columns5>       ,<columns6>did you eat?,</columns6>
ccccc   dddddd  0,5     7       ,<columns5>1,</columns5>       ,<columns6>how are you?,</columns6>
ccccc   dddddd  0,5     7       ,<columns5>1,</columns5>       ,<columns6>did you eat?,</columns6>

但我想达到这个结果:

column1 column2 column3 column4 column5 column6
aaaaa   bbbbb   0,2     6       1, 2    how are you?, did you eat?
ccccc   dddddd  0,5     7       1, 1    how are you?, did you eat?

数据库是 SQL Server 2012 和 2014。

非常感谢您的帮助

【问题讨论】:

  • column1、column2、column3、column4、column5 是复合唯一键吗?如果没有给出这些列的不同示例。

标签: sql sql-server join select


【解决方案1】:

替换以下内容:

STUFF((SELECT a.peso FOR XML PATH('')), 1, 0, ',')

STUFF((SELECT ',' + a.peso FOR XML PATH('')), 1, 1, '')

由于您的表达式只是一个列,因此您的 XML 中的值将被创建并包含在标签 &lt;peso&gt; 中。您还需要将逗号放在 XML 的开头,并从字符串中删除第一个字符(而不仅仅是在开头添加一个逗号)。

另外,最后一点,如果您的列 a.peso 可能包含特殊字符,那么我建议如下:

STUFF((SELECT ',' + a.peso FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'), 1, 1, '')

【讨论】:

  • 感谢您的回答我试过了,但我一直得到相同的结果“我在东西之前得到了这个结果:”
  • 您可能还需要将上述内容更改为相关子查询;但没有任何样本数据,这是不可能提供答案的。
猜你喜欢
  • 2013-10-27
  • 2015-07-09
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多