0

我正在尝试SalesRank根据 column 中的金额创建一列SalesAmount

我正在尝试做与此类似的事情:RANK() OVER(Order BY SalesAmount desc) as StateRank,但我不确定在将两个表连接在一起后如何执行此操作?如何在两个表合并后创建另一列?为了做到这一点,我需要将我的联合选择插入到#temptable?

这是我的表的示例:

状态标识 报告标题 报告 ID 销售额
1 加利福尼亚的在线销售 21 21512
12 纽约在线销售 37 13201
14 密歇根州的在线销售 91 9212
23 内华达州的在线销售 14 12931
8 宾夕法尼亚州的在线销售 14 23413
13 俄勒冈州的在线销售 14 9651

我期待有这样的回报:

状态标识 报告标题 报告 ID 销售额 销售排名
1 加利福尼亚的在线销售 21 21512 2
12 纽约在线销售 37 13201 3
14 密歇根州的在线销售 91 9212 6
23 内华达州的在线销售 14 12931 4
8 宾夕法尼亚州的在线销售 14 23413 1
13 俄勒冈州的在线销售 14 9651 5

这是我的查询:

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

INSERT INTO TableOne (StateId,ReportTitle,ReportId,SalesAmount)
VALUES (1,'Online Sales in California',21, 21512),(12,'Online Sales in New York',37,13201), (14,'Online Sales in Michigan',91,9212)

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

INSERT INTO TableTwo (StateId,ReportTitle,ReportId,SalesAmount)
VALUES (23,'Online Sales in Nevada',14,12931), (8,'Online Sales in Pennsylvania',14,23413), (13,'Online Sales in Oregon',14,9651)

SELECT * FROM TableOne 
UNION ALL 
SELECT * FROM TableTwo
4

2 回答 2

1

您快到了。

SELECT  *
        ,RANK() OVER (ORDER BY SalesAmount DESC) AS RowRank
FROM    (
            SELECT  *
            FROM    TableOne
            UNION ALL
            SELECT  *
            FROM    TableTwo
        ) AS t;
于 2021-05-25T00:09:27.600 回答
1

或者您可以使用公用表表达式(在这种情况下,这只是编写子查询的一种更简洁/不同的方式,但在其他情况下确实提供了更多好处)。

WITH cte AS (
  SELECT *
  FROM TableOne
  UNION ALL
  SELECT *
  FROM TableTwo
)
SELECT *
     , RANK() OVER (ORDER BY SalesAmount DESC) AS RowRank
FROM cte;
于 2021-05-25T00:46:09.967 回答