Преобразование типов данных и вычисляемый столбец - PullRequest
0 голосов
/ 10 июля 2020

У меня есть таблица со следующей структурой:

table

Unfortunately, the sale_date is stored as INT and I had to find a way to convert it in quarter (202001 will be Q1). The conversion worked well, but I need to include also some calculated columns based on this conversion. Basically, I need to calculate for Q1 the total price for each product, and the percentage from total for "product x" and "product y" recorded by each seller, in the current year. I know that I can obtain these easily using group by, but the way I converted the date (sale_date) from INT to quarter it's affecting the results.

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

1 Ответ

0 голосов
/ 10 июля 2020

Примечание: Вы всегда должны использовать правильный тип данных для столбца. Это позволит избежать множества проблем. Всегда храните значения даты в типе данных date.

Я бы посоветовал вам сначала преобразовать тип данных INT в дату, а затем использовать функции DATE для вычисления названия квартала. Он будет точным.

Ниже я добавляю 01 в качестве даты к yyyymm, а затем делаю его как yyyymmdd, чтобы получить формат даты ISO 8601 (который составляет c форматов даты), а затем вычисляет значение четверти.

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 |
+--------+--------------+---------+-------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...