如何使用 WITH

问题描述

现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我被困在最后一部分,我想离开加入所有内容(这将不得不扩展到 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,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 Monthly Revenues 列的单列。每行应该是一个月中的一天。我知道不是每个月都有 31 天。因此,例如,2 月只有 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

解决方法

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

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() 是获取一年中月份的常用函数。但是,这些特定函数在您的数据库中可能会有所不同。