基于日期键的 SQL 求和列

Posted

技术标签:

【中文标题】基于日期键的 SQL 求和列【英文标题】:SQL Summing columns based on date key 【发布时间】:2021-08-26 05:24:28 【问题描述】:

我有一个链接中给出的数据集,DataSet

我想将“order_item_unit_status”列分隔为单独的列,并带来相同的相应交易金额。所需的输出如下所示。

目标是将 txn_amt 合并到各个类别中,并根据 txn_date_key 对它们进行分组。 (基本上基于 order_item_unit_status 列进行旋转,并分别带来 txn_amt。)

我使用了下面的代码,

Select *, CASE WHEN order_item_unit_status ='DELIVERED'
THEN txn_amt ELSE 0 END as DELIVERED, 
CASE WHEN order_item_unit_status ='RETURNED'
THEN txn_amt ELSE 0 END as RETURNED
from sales

得到链接Output中提到的输出

输出未根据 txn_date_key 和找到的多个行项目进行分组。如果我使用 GROUP BY txn_date_key,则会引发错误。

我还被告知服务器受HiveSQL支持,不支持使用“:”,日期时间,临时表无法创建。鉴于这些限制,我目前一直在纠结如何去做。

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

您必须使用group by 中的列:

编辑:还为正确的输出添加了SUM()...

Select *, 

SUM(CASE WHEN order_item_unit_status ='DELIVERED'
THEN txn_amt ELSE 0 END) as DELIVERED, 

SUM(CASE WHEN order_item_unit_status ='RETURNED'
THEN txn_amt ELSE 0 END) as RETURNED

from sales
group by txn_amt,txn_date_key,order_item_unit_status

在 hivesql 中你可以使用from_unixtime 命令

Unixtime

【讨论】:

【参考方案2】:

所有未聚合和选择的列都属于分组依据。

这个查询产生你需要的结果:

Select txn_date_key, 
       sum(CASE WHEN order_item_unit_status ='DELIVERED' 
                THEN txn_amt ELSE 0 END)                  as DELIVERED, 
       sum(CASE WHEN order_item_unit_status ='RETURNED'
                THEN txn_amt ELSE 0 END)                  as RETURNED
from sales
group by txn_date_key

结果:

txn_date_key    delivered   returned
20190701           3200     0
20210631           0        3000

【讨论】:

嗨@leftjoin 我尝试了group by,但最终出现错误。请找到错误链接Link @Sid 使用我发布的查询:dbfiddle.uk/…。列可以分组或聚合。 @Sid 。 . .这实际上可以满足您的要求,并且应该是公认的答案。您接受的答案将返回给定日期的两行,一行用于交付,另一行用于退回。

以上是关于基于日期键的 SQL 求和列的主要内容,如果未能解决你的问题,请参考以下文章

在 CTE 中对日期范围内的列求和?

SQL - 更新表,以便在给定另一列的键的情况下对一列求和

t sql 基于行日期的派生列

如何创建基于当前日期/月份动态更改列顺序的 sql 表?

Oracle Query 按另一个表中的每个日期范围对一列求和

SQL - 按日期和年份求和