如何解决如何使用 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()
是获取一年中月份的常用函数。但是,这些特定函数在您的数据库中可能会有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。