Добавление данных о продажах в таблицу MS SQL-Server в виде VARCHAR только с двумя десятичными разрядами через python - PullRequest
0 голосов
/ 10 октября 2019

Это особый вопрос для процесса Python ETL, включающего панд и MS SQL-Server, с подключением sqlalchemy.

Если данные о продажах принимаются в виде числа с более чем двумя десятичными знаками (например, $ 1245,456), как его можно добавить в таблицу продаж, которая является типом данных VARCHAR. Столбец продаж является VARCHAR и не может быть изменен для другого типа данных.

my_sales_file.xlsx выглядит следующим образом:

Product | Sales
--------|--------
Apple   | 1235.456
Banana  | 567.54
Pear    | 43.435
Peach   | 432.32

Пример кода:

import pandas as pd
import sqlalchemy
from sqlalchemy.types import String

con_string = 'dummy_con_string'
engine = sqlalchemy.create_engine(con_string)

# read the file, force string datatype
df = pd.read_excel('my_sales_files.xlsx', dtype=str)

# round sales to a decimal value
df['Sales'] = df['Sales'].apply(lambda x: str(round(float(x), 2)))

# append to a ms sql table
df.to_sql(name='my_table',
          con=engine,
          if_exists='append',
          dtype={'Sales': String})
SELECT SUM(CAST(Sales as float)
FROM my_table;

результаты отображаются в виде десятичного числа с последующими десятичными значениями.

Дополнительная проверка:

select * from my_table
where LEN(Sales)-CHARINDEX('.',sales) > 2 and CHARINDEX('.'sales) <> 0;

Я застрял с таблицей, которая принимает данные о продажах как VARCHAR, и мне нужно решение дляокругление и добавление беспорядочных продаж с python, так что все округления сохраняются.

1 Ответ

0 голосов
/ 10 октября 2019

Следующий форматирует и округляет число до двух десятичных знаков. Я склонен использовать try_convert(money,...), это, как правило, немного более прощающее.

Пример

Declare @YourTable Table ([Product] varchar(50),[Sales] varchar(50))  
Insert Into @YourTable Values 
 ('Apple','$1,245.456')
,('Banana','567.54')
,('Pear','43.435')
,('Peach','432.32')
,('Fig','32')

Select *
      ,AsString = format(try_convert(money,Sales),'0.00') 
 From @YourTable

Возвращает

Product Sales       AsString
Apple   $1,245.456  1235.46  << Notice Rounded and $ and , not an issue
Banana  567.54      567.54
Pear    43.435      43.44
Peach   432.32      432.32
Fig     32          32.00     << Notice two decimals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...