我可以使用一些帮助编写查询,该查询将使我遇到的最奇怪的表之一变成有用的东西。这样就可以了。这是一个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…
我可以在这种类型的转换中使用任何方便的技巧吗?我正在努力!
谢谢您的关注。 :)
您可以使用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