在SQL中查询凌乱的表

问题描述 投票:2回答:1

我可以使用一些帮助编写查询,该查询将使我遇到的最奇怪的表之一变成有用的东西。这样就可以了。这是一个SQL表(俗称“ THRESHOLDS”),它显示阈值的每周概要。看起来像:

Column 1, 'Product' = X
Column 2, 'Monday_AM' = 0-2;1-2;2-2;3-2;4-2;5-2;6-2;7-2;8-2;9-2;10-2;11-2
Column 3, 'Monday_PM' = 0-2;1-2;2-2;3-2;4-2;5-2;6-2;7-2;8-2;9-2;10-2;11-2
...
Column 15, 'Sunday_PM' = 0-2;1-2;2-2;3-2;4-2;5-2;6-2;7-2;8-2;9-2;10-2;11-2

您可以看到,有14列具有阈值,每半天一列。在行上,我们有从(假设)A到Z的产品,每一天和每一小时的产品都具有不同的阈值。

我想拥有(基于上面的示例)是:

Product     Day     Hour    Threshold
X           1       0       2
X           1       1       2
X           1       2       2
X           1       3       2
X           1       4       2
X           1       5       2
X           1       6       2
X           1       7       2
X           1       8       2
X           1       9       2
X           1       10      2
X           1       11      2
X           1       12      2
X           1       13      2
X           1       14      2
X           1       15      2
X           1       16      2
X           1       17      2
X           1       18      2
X           1       19      2
X           1       20      2
X           1       21      2
X           1       22      2
X           1       23      2
X           2       0       2
X           2       1       2
X           2       2       2
X           2       3       2
etc…

我可以在这种类型的转换中使用任何方便的技巧吗?我正在努力!

谢谢您的关注。 :)

sql sql-server delimiter transpose
1个回答
0
投票

您可以使用cross apply取消透视,然后使用string_split()和一些字符串操作:

select t.product, v.day
       (left(s.value, charindex('-', s.value))  + v.offset) as hour,
       stuff(s.value, 1, chardindex('-', s.value))
from t cross apply
     (values (t.monday_am, 1, 0), 
             (t.monday_pm, 1, 12),
             (t.tuesday_am, 2, 0),
             . . .
     ) v(str, day, offset)
     string_split(t.column2, ';') s
© www.soinside.com 2019 - 2024. All rights reserved.