【问题标题】:Outputting a column as a different number from a different table将列输出为来自不同表的不同数字
【发布时间】:2021-07-08 14:05:43
【问题描述】:

目标是根据 Inventory 表中的数量对 Movies 表进行排名,以便对于每个重复值,它会跳过后续值,以便下一个非重复值保持在其应有的位置。显示 MovieID、最新标题、价格和排名。

而电影表中的MovieId“1”对应于电影库存表中的MovieId“101”,依此类推。

这些是表格

电影

MovieId latest title Price
1 Breaking Dawn 200.00
2 The Proposal 185.00
3 Iron Man 2 180.00
4 Up 180.00
5 The Karate Kid 190.00
6 How to train your Dragon 190.00
7 Spiderman 3 195.00

电影库存

MovieId Quantity
101 3
105 4
107 5
108 7
110 8
111 4

这是我对显示大量 NULL 的代码的尝试

SELECT CASE
        WHEN Movies.MovieId + 100 = MovieInventory.MovieID 
        THEN CAST(MovieInventory.MovieID AS INT) 
        END AS 'MovieId',

    Movies.LatestTitle, Movies.Price,
    DENSE_RANK() OVER (ORDER BY Movies.MovieId DESC) AS [Rank]
FROM Movies, MovieInventory WHERE MovieInventory.MovieID IS NOT NULL
GO

【问题讨论】:

  • 进化!没有人应该使用old-style joins。这是意外交叉连接造成的问题的一个很好的例子。

标签: sql-server sql-server-2012


【解决方案1】:

这就是你需要的。

注意事项:

  • 您需要RANK 而不是DENSE_RANK 才能达到您想要的结果
  • 您需要通过Quantity订购
  • 使用正确的JOIN 语法,而不是逗号, 连接
  • 使用表别名以获得更好的可读性
  • 外键和主键关系很奇怪:mi.MovieID 看起来是varchar,但转换为int 时比m.MovieID 多100 倍???
  • SELECT 中的计算不适用于JOIN 条件
  • 请勿使用撇号 '' 引用列名
SELECT
    mi.MovieId,
    m.LatestTitle,
    m.Price,
    RANK() OVER (ORDER BY mi.Quantity DESC) AS [Rank]
FROM Movies m
JOIN MovieInventory mi ON TRY_CAST(mi.MovieID AS int) = m.MovieID + 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多