【问题标题】:Need help in getting desired result through SQL query [closed]需要通过 SQL 查询获得所需结果的帮助 [关闭]
【发布时间】:2021-04-29 06:54:53
【问题描述】:

我正在尝试找出制作大多数“神秘”类型电影的年份和电影数量。根据表格样本数据,答案应该是2001年和2年。

下面是用值创建表的代码

CREATE TABLE movie$
(
    mov_id int NOT NULL,
    mov_title varchar(50) NOT NULL,
    mov_year int
);

INSERT INTO movie$ (mov_id, mov_title, mov_year)
VALUES 
(1001,'movie1', 2001),
(1002,'movie2', 2001),
(1003,'movie3', 2001),
(1004,'movie4', 2002),
(1005,'movie5', 2003);

CREATE TABLE movie_genres$
(
    mov_id int NOT NULL,
    gen_id int
); 
  
INSERT INTO movie_genres$ (mov_id, gen_id)
VALUES
(1001, 1),
(1002, 1),
(1003, 2),
(1004, 3),
(1005, 4);


CREATE TABLE Genres$
(
    gen_id int NOT NULL,
    gen_title varchar(50) NOT NULL
);

INSERT INTO Genres$ (gen_id , gen_title)
VALUES 
(1, 'Mystery'),
(2, 'Adventure'),
(3, 'Thriller'),
(4, 'Action');

下面是我要执行的查询

SELECT 
    movie.mov_year, COUNT(movie.mov_year) AS 'total_movies'
FROM
    movie$ movie 
JOIN 
    movie_genres$ m_genres ON m_genres.mov_id = movie.mov_id
JOIN 
    genres$ genres ON genres.gen_id = m_genres.gen_id
                   AND genres.gen_title LIKE '%mystery%'
GROUP BY 
    movie.mov_year
HAVING 
    movie.mov_year IN (SELECT movie.mov_year mov_yr 
                       FROM movie$ m 
                       WHERE COUNT([mov_year]) = (SELECT MAX(movie_count) maxcount 
                                                  FROM 
                                                      (SELECT COUNT([dbo].[movie$].[mov_year]) movie_count 
                                                       FROM [dbo].[movie$] 
                                                       GROUP BY movie$.mov_year)))

我没有得到我在放置别名时错过的地方,因为它在最后一个括号中显示错误,而且它没有在 MAX 函数中获取 movie_count 别名的值。

请指导。

【问题讨论】:

  • 你的表名真的以$结尾吗?
  • @TimBiegeleisen 是的,我会更新它们,请您让我知道您对我面临的问题的建议。
  • 你说你在上一个问题中解决了这个问题?您的别名位于最后两个括号之间,如果您将其布置得更好(而不是内联),它就会变得很明显。

标签: sql sql-server syntax subquery max


【解决方案1】:

您可以使用CTERow_Number() 来简化此操作。

WITH MysteryMovies AS (
SELECT 
    movie.mov_year, COUNT(movie.mov_year) AS 'total_movies'
    , ROW_NUMBER() OVER (ORDER BY COUNT(movie.mov_year) DESC ) AS rowId
FROM
    movie movie 
JOIN 
    movie_genres m_genres ON m_genres.mov_id = movie.mov_id
JOIN 
    genres genres ON genres.gen_id = m_genres.gen_id
                   AND genres.gen_title LIKE '%mystery%'
GROUP BY 
    movie.mov_year
)
SELECT mov_year
      ,total_movies  
FROM MysteryMovies 
WHERE rowId = 1

dbfiddle

【讨论】:

    【解决方案2】:

    你写了一个非常糟糕的查询。

    这是我创建的问题:

    1. 使用COUNT()时,使用HAVING作为条件
    2. 为子查询使用别名
    3. 检查表名!!!
    SELECT
        movie.mov_year, COUNT(movie.mov_year) AS 'total_movies'
    FROM 
        movie$ movie 
    JOIN 
        movie_geners$ m_geners ON m_geners.mov_id = movie.mov_id
    JOIN 
        geners$ geners ON geners.gen_id = m_geners.gen_id
                       AND geners.gen_title LIKE '%mystery%'
    GROUP BY 
        movie.mov_year
    HAVING 
        movie.mov_year IN
           (SELECT 
                mov_year mov_yr 
            FROM 
                movie$ m 
            GROUP BY 
                mov_year
            HAVING 
                COUNT([mov_year]) = 
                   (SELECT 
                        MAX(a.movie_count) maxcount 
                    FROM 
                       (SELECT 
                            COUNT([dbo].[movie$].[mov_year]) movie_count 
                        FROM 
                            [dbo].[movie$] 
                        GROUP BY 
                            movie$.mov_year
                        ) AS a
                   ) 
            )
    

    在这里,DB FIDDLE,您现在可以查看它是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多