【问题标题】:TSQL - View with cross apply and pivotTSQL - 使用交叉应用和透视查看
【发布时间】:2015-05-05 21:16:58
【问题描述】:

这是我的基表:

docID |  rowNumber | Column1 |  Column2 | Column3

我使用交叉应用和透视将 Column1 中的记录转换为实际列,并将 column2 和 column3 中的值用作新列的记录。在我的fiddle 中,您可以看到基本和转换后的选择语句。

我有像植物和颜色这样编号的列,例如Plant1、Plant2、Plant3、Color1、Color2等

对于存在于所有植物列中的每种植物,我想在一个列中创建一个新行,其中包含逗号分隔的颜色列表。

我想要实现的也在下面的截图中:

这应该成为在 Excel 中使用的视图。我需要如何修改视图以获得所需的结果?

附加问题:长度列是数字。有没有办法以用户身份从 Excel 中切换小数分隔符并将其应用于此或所有数字列,以便 Excel 将其识别为数字? 我曾经有一个旧的 php web 查询,我会从 Excel 中的下拉单元格中传递分隔符作为参数。

谢谢。

【问题讨论】:

  • 更大的图景会很有帮助
  • 右击图片->“显示图片”什么的。它会变得更大:-)

标签: sql-server excel tsql


【解决方案1】:

首先,您的数据存储方式是一团糟。如果可以的话,我建议阅读好的数据结构并修复你的数据结构。这是一个 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

【讨论】:

  • 真的很漂亮。非常感谢斯蒂芬!我知道数据很乱,但不幸的是我对此没有影响。
  • 如果添加了像Color12这样的两位数的Plant和Color“列”,我需要如何修改子字符串函数?
  • 我想的和托尼一样多。那是常态。有人搞得一团糟,然后其他人就被困住了。至于两位数,抱歉。我在 PATINDEX() 中忘记了通配符“%”。现在,它应该适用于任意数量的数字。
  • 知道了。再次感谢!
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2017-01-26
  • 2012-04-07
相关资源
最近更新 更多