数据类型转换和计算列

Datatype conversion and calculated column

我有一个具有以下结构的 table:

不幸的是,sale_date 存储为 INT,我必须找到一种方法将其转换为季度(202001 将是 Q1)。转换效果很好,但我还需要包括一些基于此转换的计算列。基本上,我需要为 Q1 计算当年每个产品的总价,以及每个卖家记录的“产品 x”和“产品 y”占总价的百分比。我知道我可以使用 group by 轻松获得这些,但是我将日期 (sale_date) 从 INT 转换为季度的方式影响了结果。

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

注意:您应该始终为列使用正确的数据类型。会避免很多问题。始终以 date 数据类型存储日期值。

我建议您先将 INT 转换为日期数据类型,然后使用 DATE 函数计算季度名称。它将是准确的。

下面我将 01 作为日期添加到 yyyymm,然后将其设为 yyyymmdd,使其设为 ISO 8601 dateformat(与日期格式无关) 然后计算季度值。

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 |
+--------+--------------+---------+-------------+