如何从订阅数据获取 Tableau 中的事务数据?
How to get from a subscriptions data to transactional data in Tableau?
我有一大块订阅数据,如下所示:
customer_name start_date end_date subscription_amount
A 1-7-2017 31-10-2017 4 USD/month
B 1-8-2017 30-09-2017 2 USD/month
C 1-10-2017 30-11-2017 3 USD/month
我需要将其转换为交易数据,因此最终结果应如下所示:
customer_name payment_date amount
A 1-7-2017 4 USD
A 1-8-2017 4 USD
A 1-9-2017 4 USD
A 1-10-2017 4 USD
B 1-8-2017 2 USD
B 1-9-2017 2 USD
C 1-10-2017 3 USD
C 1-11-2017 3 USD
我需要将此转换为 运行 Tableau 中的分析,但 Excel 解决方案也是可以接受的。我不想手动完成,而是在寻找 SQL 或 Python 的自动化解决方案(我对这两个都不熟悉)
使用python (您需要对数据进行一些格式化以与您的问题完全匹配,但思路就在这里) http://rextester.com/OENHUT92986
使用此综合列表 listMonths = [dt.strftime("%Y-%m-01") for dt in rrule(MONTHLY, dtstart=dtstart, until=until)
列出 2 个日期之间每个月的第一天。
import datetime
import time
from dateutil import parser
from dateutil.rrule import rrule, MONTHLY
data=[
{"customer_name":"A" ,"start_date":"2017-07-01","end_date":"2017-10-31","subscription_amount":"4 USD/month"},
{"customer_name":"B" ,"start_date":"2017-08-01","end_date":"2017-09-30","subscription_amount":"2 USD/month"},
{"customer_name":"C" ,"start_date":"2017-10-01","end_date":"2017-11-30","subscription_amount":"3 USD/month"}
]
for datum in data :
dtstart=parser.parse(datum["start_date"])
until=parser.parse(datum["end_date"])
listMonths = [dt.strftime("%Y-%m-01") for dt in rrule(MONTHLY, dtstart=dtstart, until=until)]
for month in listMonths :
print datum["customer_name"],month,datum["subscription_amount"]
将产生:
A 2017-07-01 4 USD/month
A 2017-08-01 4 USD/month
A 2017-09-01 4 USD/month
A 2017-10-01 4 USD/month
B 2017-08-01 2 USD/month
B 2017-09-01 2 USD/month
C 2017-10-01 3 USD/month
C 2017-11-01 3 USD/month
这里是 MS 中的一个查询-SQL
if object_id('tempdb..#subscriptions') IS NOT NULL DROP TABLE #subscriptions
如果 object_id('tempdb..#Calendar') 不是 NULL DROP TABLE #Calendar
声明@min_date为日期
将@max_date 声明为日期
创建table #subscriptions
(
customer_name 字符,
开始日期,
end_date 日期,
subscription_amount钱,
货币周期 varchar(10)
)
创建table #Calendar
(
Date_f 日期
)
insert into #subscriptions values('A',CAST('2017-7-01 00:00:00.000' as date),CAST('2017-07-10 00:00:00 .000' 作为日期),4,'USD/month')
插入 #subscriptions values('B',CAST('2017-8-01 00:00:00.000' 作为日期),CAST('2017-08-04 00:00:00.000' 作为日期),2,'USD/month')
插入#subscriptions values('C',CAST('2017-10-01 00:00:00' as date),CAST('2017-10-02 00:00:00.000' as date), 3,'USD/month')
---这里我们需要获取所有寄存器的MIN和MAX日期
设置@min_date = (select MIN(startdate) FROM #subscriptions)
设置@max_date = (select MAX(end_date) FROM #subscriptions)
--这里我们创建一个关于所有寄存器的最小和最大日期的临时日历
当@min_date <= @max_date
开始
插入#Calendar (Date_f)
SELECT@min_date
SET @min_date = DATEADD(天, 1,@min_date)
结束
--最终结果
SELECT B.customer_name,A.Date_f 作为 'payment_date',
CONCAT(CAST(subscription_amount as int),' ','USD') as 'subscription_amount'
来自#Calendar A
INNER JOIN #subscriptions B
在 A.Date_f 开始日期和 end_date
之间
我有一大块订阅数据,如下所示:
customer_name start_date end_date subscription_amount
A 1-7-2017 31-10-2017 4 USD/month
B 1-8-2017 30-09-2017 2 USD/month
C 1-10-2017 30-11-2017 3 USD/month
我需要将其转换为交易数据,因此最终结果应如下所示:
customer_name payment_date amount
A 1-7-2017 4 USD
A 1-8-2017 4 USD
A 1-9-2017 4 USD
A 1-10-2017 4 USD
B 1-8-2017 2 USD
B 1-9-2017 2 USD
C 1-10-2017 3 USD
C 1-11-2017 3 USD
我需要将此转换为 运行 Tableau 中的分析,但 Excel 解决方案也是可以接受的。我不想手动完成,而是在寻找 SQL 或 Python 的自动化解决方案(我对这两个都不熟悉)
使用python (您需要对数据进行一些格式化以与您的问题完全匹配,但思路就在这里) http://rextester.com/OENHUT92986
使用此综合列表 listMonths = [dt.strftime("%Y-%m-01") for dt in rrule(MONTHLY, dtstart=dtstart, until=until)
列出 2 个日期之间每个月的第一天。
import datetime
import time
from dateutil import parser
from dateutil.rrule import rrule, MONTHLY
data=[
{"customer_name":"A" ,"start_date":"2017-07-01","end_date":"2017-10-31","subscription_amount":"4 USD/month"},
{"customer_name":"B" ,"start_date":"2017-08-01","end_date":"2017-09-30","subscription_amount":"2 USD/month"},
{"customer_name":"C" ,"start_date":"2017-10-01","end_date":"2017-11-30","subscription_amount":"3 USD/month"}
]
for datum in data :
dtstart=parser.parse(datum["start_date"])
until=parser.parse(datum["end_date"])
listMonths = [dt.strftime("%Y-%m-01") for dt in rrule(MONTHLY, dtstart=dtstart, until=until)]
for month in listMonths :
print datum["customer_name"],month,datum["subscription_amount"]
将产生:
A 2017-07-01 4 USD/month
A 2017-08-01 4 USD/month
A 2017-09-01 4 USD/month
A 2017-10-01 4 USD/month
B 2017-08-01 2 USD/month
B 2017-09-01 2 USD/month
C 2017-10-01 3 USD/month
C 2017-11-01 3 USD/month
这里是 MS 中的一个查询-SQL
if object_id('tempdb..#subscriptions') IS NOT NULL DROP TABLE #subscriptions 如果 object_id('tempdb..#Calendar') 不是 NULL DROP TABLE #Calendar
声明@min_date为日期 将@max_date 声明为日期
创建table #subscriptions ( customer_name 字符, 开始日期, end_date 日期, subscription_amount钱, 货币周期 varchar(10) )
创建table #Calendar ( Date_f 日期 )
insert into #subscriptions values('A',CAST('2017-7-01 00:00:00.000' as date),CAST('2017-07-10 00:00:00 .000' 作为日期),4,'USD/month') 插入 #subscriptions values('B',CAST('2017-8-01 00:00:00.000' 作为日期),CAST('2017-08-04 00:00:00.000' 作为日期),2,'USD/month') 插入#subscriptions values('C',CAST('2017-10-01 00:00:00' as date),CAST('2017-10-02 00:00:00.000' as date), 3,'USD/month')
---这里我们需要获取所有寄存器的MIN和MAX日期 设置@min_date = (select MIN(startdate) FROM #subscriptions) 设置@max_date = (select MAX(end_date) FROM #subscriptions)
--这里我们创建一个关于所有寄存器的最小和最大日期的临时日历
当@min_date <= @max_date 开始 插入#Calendar (Date_f) SELECT@min_date
SET @min_date = DATEADD(天, 1,@min_date) 结束
--最终结果
SELECT B.customer_name,A.Date_f 作为 'payment_date',
CONCAT(CAST(subscription_amount as int),' ','USD') as 'subscription_amount'
来自#Calendar A
INNER JOIN #subscriptions B
在 A.Date_f 开始日期和 end_date