如何自动将一个单元格中的多个文本字段转换为不同的行或其他格式以进行报告?

时间:2019-06-10 15:00:39

标签: sql sql-server excel google-sheets tableau

我想报告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

2 个答案:

答案 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