Как объединить несколько строк, затем группировать и считать в SQL Server - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь получить от этого

tPeople
Имя
Алиса
Боб

Животные
Имя животного
Алиса Кошка
АлисаКошка
Bob Horse
Bob Dog

К этому

Алиса "Cat * 2"
Bob "Horse, Dog"

Пока у меня естьпромежуточный стол группирования и подсчета животных

tГрупповое имя Animal Tally
Alice Cat 2
Bob Dog 1
Bob Horse 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?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Вам не нужен промежуточный стол. Вы можете просто сделать расчет в запросе. Для второго вы можете просто настроить свою логику:

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;
0 голосов
/ 17 мая 2019

Аналогичный подход к Гордону, но без 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...