【问题标题】:Selecting two tables and ranking选择两个表并排名
【发布时间】:2021-06-07 16:36:22
【问题描述】:

我正在尝试选择两个具有相同列的表并将它们组合成 1,这将使列 SalesAmount 从最高到最低排列。我试图通过使用UNION ALL 来做到这一点,但目前,返回的选择正在分别对它们进行排名。

TableTwoReportId 值与 TableOne 中的值不同。

这是从TableOne 语句返回的选择示例:

StateId ReportTitle ReportId SalesAmount SalesRank
1 Online Sales in California 21 22 1
12 Online Sales in New York 21 13 2
23 Online Sales in Nevada 21 9 4

这是一个从 TableTwo 返回的 select 示例,它只有 1 个值:

StateId ReportTitle ReportId SalesAmount SalesRank
14 Online Sales in Michigan 91 11 3

我现在正在尝试合并这两个表并相应地对它们进行排名。使用 UNION ALL 时返回的内容如下:

StateId ReportTitle ReportId SalesAmount SalesRank
1 Online Sales in California 21 22 1
12 Online Sales in New York 37 13 2
23 Online Sales in Nevada 14 9 4
14 Online Sales in Michigan 91 11 3

Michigan 行排名第 3。它将两个表都选择到 1 个语句中,但没有像我尝试的那样对它们进行排名。我怎样才能做到这一点?我的预期结果是两个表都按SalesRank 适当排序

这是我预期结果的示例:

StateId ReportTitle ReportId SalesAmount SalesRank
1 Online Sales in California 21 22 1
12 Online Sales in New York 37 13 2
14 Online Sales in Michigan 91 11 3
23 Online Sales in Nevada 14 9 4

这是一个查询示例:

CREATE TABLE TableOne
(
    StateId INT,
    ReportTitle VARCHAR(100),
    ReportId INT,
    SalesAmount Money, 
    SalesRank INT
)

INSERT INTO TableOne (StateId,ReportTitle,ReportId,SalesAmount, SalesRank)
VALUES (1,'Online Sales in California',21, 22, 1),(12,'Online Sales in New York ',21, 13, 1),  (1,'Online Sales in Nevada',21, 9, 4)

CREATE TABLE TableTwo
(
    StateId INT,
    ReportTitle VARCHAR(100),
    ReportId INT,
    SalesAmount Money, 
    SalesRank INT
)

INSERT INTO TableOne (StateId,ReportTitle,ReportId,SalesAmount, SalesRank)
VALUES (14,'Online Sales in Michigan',91, 11, 3)

SELECT * FROM TableOne 
UNION ALL 
SELECT * FROM TableTwo

【问题讨论】:

  • 您的第二次插入是 TableOne - 可能应该是 TableTwo。并且您已将 SalesRank 1 两次插入 TableOne。
  • 对于一个结构良好的问题加一个 - 即使它是微不足道的:)
  • 请澄清您的问题,因为预期的 ReportId 值与上面的示例数据不匹配。

标签: sql sql-server tsql


【解决方案1】:

您的尝试没有order by 子句?所以当然不会下单。添加order by SalesRank 例如

SELECT *
FROM TableOne 
UNION ALL 
SELECT *
FROM TableTwo
ORDER BY SalesRank

注意:表中的行不会以任何可确定的顺序存储或访问。如果顺序很重要,您必须使用order by 子句作为select 的一部分。

【讨论】:

    【解决方案2】:

    一般来说,我喜欢在SELECT 中查看实际的列名,所以我在SalesRank 上添加了这些名称和ORDER BY - 不确定您是否想要默认的升序或降序。

    SELECT 
        StateId
        ReportTitle,
        ReportId,
        SalesAmount, 
        SalesRank 
    FROM TableOne 
    UNION ALL 
    SELECT 
        StateId
        ReportTitle,
        ReportId,
        SalesAmount, 
        SalesRank 
    FROM TableTwo
    ORDER BY SalesRank;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2017-06-21
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多