Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос в T- SQL - PullRequest
0 голосов
/ 22 января 2020

Я работаю / учусь на базе sakila , и я пытаюсь конвертировать в T- SQL и использовать с SQL Сервером. У меня возникли некоторые проблемы с преобразованием представления из MySql в T- SQL.

. Я проверил большинство статей здесь, в которых говорится о том, чтобы убрать агрегатную функцию из запроса, но я плохо понимаю что они означают.

В MySql вид выглядит следующим образом:

CREATE VIEW `actor_info` AS 
select `a`.`actor_id` AS `actor_id`,`a`.`first_name` AS `first_name`,`a`.`last_name` AS `last_name`,
    group_concat(
        distinct concat(`c`.`name`,': ',
            (
                select group_concat(`f`.`title` order by `f`.`title` ASC separator ', ') 
                    from ((`film` `f`
                    join `film_category` `fc` on((`f`.`film_id` = `fc`.`film_id`))) 
                    join `film_actor` `fa` on((`f`.`film_id` = `fa`.`film_id`))) 
                    where ((`fc`.`category_id` = `c`.`category_id`)
                    and (`fa`.`actor_id` = `a`.`actor_id`))
             )) 
    order by `c`.`name` ASC separator '; ') AS `film_info`

    from (((`actor` `a` 
    left join `film_actor` `fa` on((`a`.`actor_id` = `fa`.`actor_id`)))
    left join `film_category` `fc` on((`fa`.`film_id` = `fc`.`film_id`)))
    left join `category` `c` on((`fc`.`category_id` = `c`.`category_id`)))
    group by `a`.`actor_id`,`a`.`first_name`,`a`.`last_name`

, и я попытался в T- SQL с этим:

CREATE VIEW [actor_info] 
AS
    SELECT 
        a.first_name AS [First Name], a.last_name AS [Last Name],
        STRING_AGG(CONCAT(c.name,':',
                (
                    SELECT STRING_AGG(f.title, ', ')WITHIN GROUP (ORDER BY f.title)
                    FROM film f
                    join film_category fc ON f.film_id = fc.film_id
                    join film_actor fa ON f.film_id = fa.film_id
                    WHERE fc.category_id = c.category_id
                    and fa.actor_id = a.actor_id
                )
            ),';')WITHIN GROUP (ORDER BY c.name) AS [Film Info]
        FROM 
            actor a
        LEFT JOIN 
            film_actor fa ON a.actor_id = fa.actor_id
        LEFT JOIN 
            film_category fc ON fa.film_id = fc.film_id
        LEFT JOIN 
            category c ON fc.category_id = c.category_id
        GROUP BY 
            a.first_name, a.last_name
GO

Результаты, полученные из базы данных MySql, представлены в этом формате, и я хочу добиться того же в SQL Сервер:

first_name    last_name    film_info

PENELOPE       GUINESS     Animation: ANACONDA CONFESSIONS; Children: LANGUAGE COWBOY; Classics: COLOR PHILADELPHIA, WESTWARD SEABISCUIT; Comedy: VERTIGO NORTHWEST; Documentary: ACADEMY DINOSAUR; Family: KING EVOLUTION, SPLASH GUMP; Foreign: MULHOLLAND BEAST; Games: BULWORTH COMMANDMENTS, HUMAN GRAFFITI; Horror: ELEPHANT TROJAN, LADY STAGE, RULES HUMAN; Music: WIZARD COLDBLOODED; New: ANGELS LIFE, OKLAHOMA JUMANJI; Sci-Fi: CHEAPER CLYDE; Sports: GLEAMING JAWBREAKER;

NICK          WAHLBERG     Action: BULL SHAWSHANK; Animation: FIGHT JAWBREAKER; Children: JERSEY SASSY; Classics: DRACULA CRYSTAL, GILBERT PELICAN; Comedy: MALLRATS UNITED, RUSHMORE MERMAID; Documentary: ADAPTATION HOLES; Drama: WARDROBE PHANTOM; Family: APACHE DIVINE, CHISUM BEHAVIOR, INDIAN LOVE, MAGUIRE APACHE; Foreign: BABY HALL, HAPPINESS UNITED; Games: ROOF CHAMPION; Music: LUCKY FLYING; New: DESTINY SATURDAY, FLASH WARS, JEKYLL FROGMEN, MASK PEACH; Sci-Fi: CHAINSAW UPTOWN, GOODFELLAS SALUTE; Travel: LIAISONS SWEET, SMILE EARRING;

Я не могу понять, какой правильный синтаксис ... Спасибо, если вы можете помочь / направить меня по правильному синтаксису. Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2020

Вы должны сделать это с CTE в два раза:

  • Первая категория сцепления CTE с агрегацией актеров
  • Вторая CTE агрегирует результаты первых 1
...