我有一个SQL查询,显示每个帐户的时间活动。数据库是Windows Server 2008上的Microsoft SQL Server。
请帮助我使用参数Parameters.Date1
和Parameters.Date2
而不是@time
将此查询翻译为tableau。
查询结果:
USER,Date,Total time
USER1,2016-09-22,07:00:00.0000000
USER2,2016-09-22,08:00:00.0000000
USER3,2016-09-22,05:00:00.0000000
SQL查询:
DECLARE @time datetime
set @time = '08.09.2016'
SELECT
[User],
CAST(DATEADD(SECOND, sum(datediff(DAY, @time, [Start])), @time) AS date) 'Date',
CAST(DATEADD(SECOND, sum(datediff(SECOND, '00:00:00',[Period])), '00:00:00') AS time) 'Total time'
FROM
[User].[dbo].[UserAction]
WHERE
[Start] >= @time+'00:00:00' and [Start] <= @time+'23:59:59'
GROUP BY
[USER]
输入数据以构建查询:
USER, Start,End,Period
USER1,2016-09-22 09:00:00.000,2016-09-22 12:00:00.000,03:00:00
USER1,2016-09-22 12:00:00.000,2016-09-22 13:00:00.000,01:00:00
USER1,2016-09-22,13:00:00.000,2016-09-22 16:00:00.000,03:00:00
USER2,2016-09-22,09:00:00.000,2016-09-22 13:00:00.000,04:00:00
USER2,2016-09-22,13:00:00.000,2016-09-22 17:00:00.000,04:00:00
USER3,2016-09-22,09:00:00.000,2016-09-22 10:00:00.000,01:00:00
USER3,2016-09-22,10:00:00.000,2016-09-22 12:00:00.000,02:00:00
USER3,2016-09-22,12:00:00.000,2016-09-22 14:00:00.000,02:00:00
答案 0 :(得分:0)
我没有足够的虚构堆栈溢出点来发表评论而不是答案,但我同意Gordon Linoff。
sql中的表值函数可以直接在Tableau数据源中使用,并且它就像表一样对待。
注意我没有测试下面的内容,但这是等效函数的样子:
CREATE FUNCTION dbo.MyFuntion (@time datetime)
RETURNS TABLE
AS
RETURN
(
SELECT
[User]
,cast(DATEADD(SECOND, sum(datediff(DAY, @time,[Start])),@time) as date)'Date'
,cast(DATEADD(SECOND, sum(datediff(SECOND, '00:00:00',[Period])),'00:00:00') as time)'Total time'
FROM
[User].[dbo].[UserAction]
WHERE
[Start] >= @time+'00:00:00' and [Start] <= @time+'23:59:59'
GROUP BY [USER]
);
Tableau 9(尚未尝试过10)似乎不鼓励自定义SQL(它警告任何打开工作簿的人)和存储过程(与函数中的相同sql相比较慢)。
或者,将纯dbo.UserAction表添加到数据源并为后两列生成计算字段可能有效:Tableau Documentation。它似乎具有操纵日期所需的所有功能。然而,可能存在一些与可能限制它的参数相关的疯狂限制,老实说,我不记得我的头脑。
答案 1 :(得分:0)
您不需要自定义SQL。把事情简单化。将Tableau直接连接到UserAction表。
你可以: 将日(开始)放在过滤器架上,确保它是截断到日的连续日期。显示过滤器并设置过滤器,让您一次选择一个值 - 我会选择一个滑块UI。
或者写一个计算字段以放置引用参数(例如day(Start) = day(Date1)
将用户放在一个架子上,例如行,将Sum(Period)置于另一个架子上,例如列。除非Tableau无法解释您的Period字段数据类型,否则应该这样做。如果是这样,请尝试将数据类型更改为Tableau中的数字以查看它是否自动将持续时间转换为数字,否则您可能需要为转换编写计算字段。