【问题标题】:How to concatenate from multiple rows, then group and count, in SQL Server如何在 SQL Server 中从多行连接,然后分组和计数
【发布时间】:2019-10-04 17:14:04
【问题描述】:

我正在尝试从中获得帮助


名称
爱丽丝
鲍勃

t动物
命名动物
爱丽丝猫
爱丽丝猫
鲍勃·马
鲍勃狗

到这里

爱丽丝“猫*2”
鲍勃“马,狗”

到目前为止,我有一个对动物进行分组和计数的中间表

t 分组 名称动物计数
爱丽丝猫 2
鲍勃狗 1
鲍勃马 1

如果我跑了

SELECT Name, Animals=STUFF((
    SELECT N', '+animal+'*'+tally FROM tgrouped as g
    WHERE g.Name = p.Name
    FOR XML PATH(''), TYPE).value(N'.[1]', N'varchar(max)'), 1, 2, N'')
FROM tpeople as p

我明白了
命名动物
爱丽丝猫*2
鲍勃狗*1,马*1

有没有办法跳过中间表?还有什么方法可以在计数为 1 时不显示?

【问题讨论】:

  • 为什么是"Cat*2" 而不是"Dog*1"?有没有其他时候你会有不同的符号?
  • Larnu,我得到的规范要求任何重复的东西都得到计数,但如果只有一个,那么它会显示为没有计数。我认为数据请求者将进一步处理它,将货币价值分配给狗等,* 将真正充当分隔符,

标签: sql sql-server string concatenation


【解决方案1】:

您不需要中间表。您可以在查询中进行计算。第二个你可以调整你的逻辑:

WITH grouped as (
      SELECT a.name, a.animal, COUNT(*) as cnt
      FROM tAnimals a
      GROUP BY a.name, a.animal
     )
SELECT Name,
       STUFF((SELECT (CASE WHEN cnt = 1 THEN N', ' + animal
                           ELSE CONCAT(N', ', animal, '*',  cnt)
                      END)
              FROM grouped g
              WHERE p.Name = g.Name
              FOR XML PATH(''), TYPE
             ).value(N'.[1]', N'varchar(max)'
                    ), 1, 2, N''
            ) as animals
FROM tpeople p;

【讨论】:

  • @Larnu 。 . .谢谢。
【解决方案2】:

与 Gordon 类似的方法,但没有 CTE:

CREATE TABLE dbo.tPeople ([Name] nvarchar(10));
CREATE TABLE dbo.tAnimal ([Name] nvarchar(10),
                          Animal varchar(10));

INSERT INTO  dbo.tPeople ([Name])
VALUES('Alice'),('Bob');

INSERT INTO dbo.tAnimal ([Name],
                         Animal)
VALUES('Alice','Cat'),
      ('Alice','Cat'),
      ('Bob', 'Dog'),
      ('Bob', 'Horse');

GO

SELECT P.[Name] + ' "' +
       STUFF((SELECT ', ' + CONCAT(A.Animal, '*' + CONVERT(varchar(3),NULLIF(COUNT(A.Animal),1)))
              FROM dbo.tAnimal A
              WHERE A.[Name] = P.[Name]
              GROUP BY A.Animal
              FOR XML PATH(''),TYPE).value('.','varchar(MAX)'),1,2,'') + '"'
FROM dbo.tPeople P;



GO
DROP TABLE dbo.tPeople;
DROP TABLE dbo.tAnimal;

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多