这是我的基础表:
docID | rowNumber | Column1 | Column2 | Column3
我使用cross apply和pivot将Column1中的记录转换为实际列,并使用column2和column3中的值作为新列的记录。在我的fiddle中,您可以看到base和转换的select语句。
我有像植物和颜色这样的列,它们被编号,例如Plant1,Plant2,Plant3,Color1,Color2等
对于存在于所有工厂列中的每个工厂,我想在一个列中创建一个以逗号分隔的颜色列表的新行。
我想要实现的目标也在下面的屏幕截图中:
这应该成为在Excel中使用的视图。如何修改视图以获得所需的结果?
其他问题:长度列是数字。有没有办法在Excel中作为用户切换小数点分隔符并将其应用于此数字列或所有数字列,以便Excel将其识别为数字? 我曾经有一个旧的PHP网页查询,我将从Excel中的下拉列表中传递分隔符作为参数。
谢谢。
答案 0 :(得分:2)
首先,你的数据存储方式是一团糟。如果可以的话,我建议你阅读好的数据结构并修复你的数据结构。这是一个TSQL查询,可以以正确的格式获取数据。
WITH CTE_no_nums
AS
(
SELECT docID,
CASE
WHEN PATINDEX('%[0-9]%',column1) > 0
THEN SUBSTRING(column1,0,PATINDEX('%[0-9]%',column1))
ELSE column1
END AS cols,
COALESCE(column2,column3) AS vals
FROM miscValues
WHERE column2 IS NOT NULL
OR column3 IS NOT NULL
),
CTE_Pivot
AS
(
SELECT docID,partNumber,prio,[length],material
FROM CTE_no_nums
PIVOT
(
MAX(vals) FOR cols IN (partNumber,prio,[length],material)
) pvt
)
SELECT A.docId + ' # ' + B.vals AS [DocID # Plant],
A.docID,
A.partNumber,
A.prio,
B.vals AS Plant,
A.partNumber + '#' + A.material + '#' + A.[length] AS Identification,
A.[length],
SUBSTRING(CA.colors,0,LEN(CA.colors)) colors --substring removes last comma
FROM CTE_Pivot A
INNER JOIN CTE_no_nums B
ON A.docID = B.docID
AND B.cols = 'Plant'
CROSS APPLY ( SELECT vals + ','
FROM CTE_no_nums C
WHERE cols = 'Color'
AND C.docID = A.docID
FOR XML PATH('')
) CA(colors)
结果:
DocID # Plant docID partNumber prio Plant Identification length colors
---------------- ------ ---------- ---- ---------- ------------------ ------- -------------------------
D0001 # PlantB D0001 X001 1 PlantB X001#MA123#10.87 10.87 white,black,blue
D0001 # PlantC D0001 X001 1 PlantC X001#MA123#10.87 10.87 white,black,blue
D0002 # PlantA D0002 X002 2 PlantA X002#MA456#16.43 16.43 black,yellow
D0002 # PlantC D0002 X002 2 PlantC X002#MA456#16.43 16.43 black,yellow
D0002 # PlantD D0002 X002 2 PlantD X002#MA456#16.43 16.43 black,yellow