【问题标题】:How to LEFT JOIN on ROW_NUM using WITH如何使用 WITH 对 ROW_NUM 进行 LEFT JOIN
【发布时间】:2021-05-09 16:48:22
【问题描述】:

现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我被困在我想离开的最后一部分加入一切(这将不得不扩展到 12 个单独的查询)。问题基本上正如标题所暗示的那样——我想使用 WITH() 语句在创建的 Row_Num 列上加入 12 个查询,而不是创建 12 个单独的表并将它们作为表保存在数据库中。

WITH Jan_Table AS
  (SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jan_Rev
  FROM ba.SALE_TABLE a
  WHERE a.SALE_DATE BETWEEN '2015-01-01' and '2015-01-31'
  GROUP BY a.SALE_DATE)

SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jun_Rev, j.Jan_Rev
FROM ba.SALE_TABLE a

LEFT JOIN Jan_Table j
    on "j.Row_ID" = a.Row_ID

WHERE a.SALE_DATE BETWEEN '2015-06-01' and '2015-06-30'
GROUP BY a.SALE_DATE

然后我收到以下错误消息:

错误:列“j.Row_ID”不存在

我输入了“j.Row_ID”,因为上一条消息是:

错误:a.row_id 列不存在 提示:也许您的意思是 引用列“j.row_id”。

每个查询单独工作,无需 JOIN 和 WITH 函数。我一年中的每个月都有一个,并希望最终将其中的 12 个加在一起。

输出应该是包含 ROW_NUM 列和 12 个月收入列的单列。每行应该是一个月中的一天。我知道不是每个月都有 31 天。因此,例如,二月只有 28 天,这意味着我希望第 29、30 和 31 天为 NULL。上面的查询仍然有日期——但在我可以让这两个查询加入之后,我将删除“SALE_DATE”列。

我最初的想法只是创建 12 个表,但我认为如果我要扩展此解决方案,那将是对空间的非常糟糕的使用,并且不是解决此问题的最合乎逻辑的解决方案。

编辑

下面是上面两个 qaruies 的单独输出,第三个表是我想要制作的。我不能给你原始数据。以上所有内容都已根据我正在使用的数据的实际列名和用途进行了更改。而且我不知道如何创建数据集——这在 SQL 中太让我头疼了。

Jan_Table(前五行)

Row_Num        Date          Jan_Rev
1           2015-01-01          20
2           2015-01-02          20
3           2015-01-03          20
4           2015-01-04          20
5           2015-01-05          20

Jun_Table(前五行)

Row_Num        Date          Jun_Rev
1           2015-06-01          30
2           2015-06-02          30
3           2015-06-03          30
4           2015-06-04          30
5           2015-06-05          30

JOINED_TABLE(前五行)

Row_Num        Date          Jun_Rev           Date          Jan_Rev
1           2015-06-01          30           2015-01-01          20
2           2015-06-02          30           2015-01-02          20
3           2015-06-03          30           2015-01-03          20
4           2015-06-04          30           2015-01-04          20
5           2015-06-05          30           2015-01-05          20

【问题讨论】:

  • 样本数据、期望的结果以及对您想要实现的逻辑的清晰解释(而不是“如何”您现在正在做的事情)都是有帮助的。从它的外观来看,“j.Row_ID”是一个错字,问题应该很接近了。
  • 我的意思是我已经尝试过使用和不使用引号。我已经尝试过全部小写和全部大写。你至少能告诉我你看到了什么错字,因为我看不到它。我还添加了我希望最终输出的样子,但我认为我不能给你数据。所以我输入了一些虚构的数字。
  • 用您正在使用的数据库标记您的问题。
  • 我完全不知道我在使用什么软件。我所做的一切都在一个名为潜望镜的程序中。我正在使用我在 Microsoft SQL 课程中所知道的知识,但我只能告诉你这些。

标签: sql left-join with-statement rownum


【解决方案1】:

您似乎可以对完整查询使用分组依据和条件聚合:

select day(sale_date),
       max(case when month(sale_date) = 1 then sale_date end) as jan_date,
       max(case when month(sale_date) = 1 then revenue end) as jan_revenue,
       max(case when month(sale_date) = 2 then sale_date end) as feb_date,
       max(case when month(sale_date) = 2 then revenue end) as feb_revenue,
       . . .
from sale_table s
group by day(sale_date)
order by day(sale_date);

您尚未指定正在使用的数据库。 DAY() 是常用的获取月份日期的函数; MONTH() 是获取一年中月份的常用函数。但是,这些特定功能在您的数据库中可能会有所不同。

【讨论】:

  • 这成功了!谢谢!但显然我必须使用 extract() 函数才能让一切顺利进行。我不知道来自哪个数据库,但无论我在做什么,都没有 MONTH() 或 DAY()。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2021-12-21
  • 2013-11-02
  • 2011-06-12
  • 1970-01-01
  • 2011-12-20
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多