我想报告Tableau中的数据,我在数据源中的一列遇到麻烦,该列中有多个用逗号分隔的文本。它目前在Google表格中,我计划在数据仓库中建立一个表格,然后将其链接到该表格以进行报告。数据如下所示:
ID Year Location Fruits
1 2018 USA Apple, Banana, Kiwi
2 2019 Japan Kiwi, Orange, Mango, (up to 40 fruits in some columns)
我正在寻找一种报告“水果”列的方法,例如枢轴。例如,一种查看趋势的方法:2018年有多少个苹果与2019年有多少个苹果?在美国有多少个苹果实例?像这样的指标。 我愿意重塑数据以适应我的需求。使用SQL查询数据并导入到Tableau。
Tableau 2018.3 Oracle SQL Server
答案 0 :(得分:0)
首先,您将用逗号分隔的数据分成几行,然后将数据保存到表对象中 并使用sqlserver连接将该表拉入tableau,下面是代码
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp
;WITH CTE(ID,[Year], Location, Fruits)
AS
(
SELECT 1,2018,'USA' ,'Apple, Banana, Kiwi' UNION ALL
SELECT 2,2019,'Japan','Kiwi, Orange, Mango'
)
SELECT ID,[Year], Location,
LTRIM(RTRIM(Split.a.value('.','nvarchar(max)'))) AS Fruits INTO #Temp
FROM
(
SELECT ID,[Year], Location,
CAST( '<S>'+ REPLACE(Fruits,',','</S><S>') +'</S>' AS XML ) AS Fruits
FROM CTE
) AS A
CROSS APPLY Fruits.nodes('S') AS Split(a)
SELECT *
FROM #Temp
在SQL Server中使用PIVOT可以预期结果
SELECT DISTINCT ID,Location ,[2018],[2019]
FROM
(
SELECT *
FROM #Temp
) AS src
PIVOT
(
COUNT(Fruits) FOR [Year] IN ([2018],[2019])
) AS pvt
ORDER BY ID
结果
ID Location 2018 2019
---------------------------
1 USA 3 0
2 Japan 0 3
答案 1 :(得分:0)
如果您的SQL Server兼容性级别> = 130,则可以使用STRING_SPLIT()
DECLARE @T TABLE (ID INT, Fruits NVARCHAR(MAX))
INSERT @T VALUES
(1,'Apple,Banana,Kiwi'),
(2,'Kiwi,Orange,Mango')
SELECT
ID,
COUNT(*)
FROM
@T T
CROSS APPLY STRING_SPLIT(Fruits, ',') AS X
GROUP BY
ID