如何将此SQL查询转换为tableau?

时间:2016-09-10 13:30:14

标签: sql sql-server-2008 tableau

enter image description here

我有一个SQL查询,显示每个帐户的时间活动。数据库是Windows Server 2008上的Microsoft SQL Server。

请帮助我使用参数Parameters.Date1Parameters.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

2 个答案:

答案 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中的数字以查看它是否自动将持续时间转换为数字,否则您可能需要为转换编写计算字段。