数据类型转换和计算列

kpbpu008  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(250)

我有一张结构如下的table:

不幸的是 sale_date 存储为int,我必须找到一种方法在季度内转换它(202001将是q1)。转换工作得很好,但我还需要包含一些基于此转换的计算列。基本上,我需要计算第一季度每个产品的总价格,以及每个卖家在当年记录的“产品x”和“产品y”占总价格的百分比。我知道我可以很容易地获得这些使用组,但我转换的方式日期( sale_date )从一个季度到另一个季度都在影响着结果。

SELECT
  seller,
  product_name,
  LEFT([sale_date],4) Year,
  'Q'+ CAST((CAST(RIGHT(sale_date,2) AS INT)-1 )/3 +1 AS varchar) Quarter,
  (price),
  price * 100.0 / sum(price) over () as percentage_total,
  SUM (price) as total_sales
FROM table1
GROUP BY
  LEFT(sale_date,4),
  'Q'+ CAST((CAST(RIGHT(sale_date,2) AS INT) -1 )/3 +1 AS varchar),
  seller,
  product_name,
  price
koaltpgm

koaltpgm1#

注意:您应该始终为列使用正确的数据类型。它可以避免很多问题。始终将日期值存储在 date 数据类型。
我建议你先把 INT 更新数据类型,然后使用 DATE 用于计算季度名称的函数。它将是准确的。
下面我要补充 01 作为截止日期 yyyymm 然后把它变成 yyyymmdd ,使其成为iso8601 dateformat(与dateformats无关),然后计算季度值。

declare @table table(sales_date int, product_name varchar(30),seller varchar(30), price int)

insert into @table
VALUES(202001,'Product X', 'Agent1',2320),(202001,'Product X', 'Agent2',1416),
(202004,'Product X', 'Agent1',420)

SELECT seller, product_name,
CONCAT('Q',DATENAME(QUARTER,CONCAT(CAST(sales_date AS VARCHAR(10)),'01'))) as Quarter,
sum(price) as total_sales
from @table
group by seller, product_name,
CONCAT('Q',DATENAME(QUARTER,CONCAT(CAST(sales_date AS VARCHAR(10)),'01')))
+--------+--------------+---------+-------------+
| seller | product_name | Quarter | total_sales |
+--------+--------------+---------+-------------+
| Agent1 | Product X    | Q1      |        2320 |
| Agent1 | Product X    | Q2      |         420 |
| Agent2 | Product X    | Q1      |        1416 |
+--------+--------------+---------+-------------+

相关问题