Sql 如何使用WITH在第_NUM行左连接

Sql 如何使用WITH在第_NUM行左连接,sql,left-join,with-statement,rownum,Sql,Left Join,With Statement,Rownum,现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我在最后一部分遇到了麻烦,我想留下来加入所有内容(这必须扩展到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)

现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我在最后一部分遇到了麻烦,我想留下来加入所有内容(这必须扩展到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\u id不存在提示:可能是您的意思 参考列“j.row_id”

每个查询在不使用联接和函数的情况下单独工作。我一年中每个月都有一个,我希望最终加入其中的12个

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

我最初的想法是只创建12个表,但我认为如果我扩展这个解决方案,这将是一个非常糟糕的空间使用,并且不是这个问题最合理的解决方案

编辑

下面是上面两个qaruies的单独输出,第三个表是我试图制作的。我不能给你原始数据。以上所有内容都已从我使用的实际列名和数据目的中更改。我不知道如何创建数据集——这在SQL中太难了

Jan_表(前五行)

Jun_表(前五行)

联接表(前五行)


似乎您可以在完整查询中使用group by和条件聚合:

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

示例数据、所需结果以及对要实现的逻辑(而不是“如何”实现)的清晰解释都很有帮助。从表面上看,“j.Row_ID”是一个拼写错误,这个问题应该很接近。我的意思是,我试过引用和不引用。我试过所有小写字母和大写字母。你能不能至少告诉我你看到了什么错字,因为我看不见。我还添加了我想要的最终输出,但我不认为我可以给你数据。所以我输入了一些虚构的数字。用你正在使用的数据库标记你的问题。我不知道我在用什么软件。我所做的一切都在一个叫做潜望镜的程序中。我正在使用我在Microsoft SQL课堂上学到的知识,但这就是我能告诉你的全部。这很有效!非常感谢。但显然,我必须使用extract()函数才能使一切正常进行。我不知道它来自哪个数据库,但无论我在哪里工作,都没有MONTH()或DAY()。
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
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);