【发布时间】:2021-10-19 23:30:02
【问题描述】:
我正在尝试编写一个查询,该查询将使一列根据另一个逗号分隔的列显示特定值。这些代码用于表示常规时间/加班时间/双倍时间/等,它们来自前面提到的逗号分隔列。在原始视图中,每个不同的小时数都有单独的列。为此,我们可以说 A = 常规时间,B = 双倍时间,C = 加时。但是,我们有很多代码可以表示相同类型的时间。
我原来的视图是什么样的:
| Employee_FullName | EmpID | Code | Regular Time | Double Time | Overtime |
|---|---|---|---|---|---|
| John Doe | 123 | A,B | 7 | 2 | 0 |
| Jane Doe | 234 | B | 4 | 0 | 1 |
我的查询输出:
| Employee_FullName | EmpID | Code | Hours |
|---|---|---|---|
| John Doe | 123 | A, B | 10 |
| John Doe | 123 | A, B | 5 |
| Jane Doe | 234 | B | 5 |
我希望输出的样子:
| Employee_FullName | EmpID | Code | Hours |
|---|---|---|---|
| John Doe | 123 | A | 10 |
| John Doe | 123 | B | 5 |
| Jane Doe | 234 | B | 5 |
它看起来像在第一个表中的方式,因为目前它只是从常规时间列中提取。我尝试使用大小写开关让它查找特定代码然后提取数字,但无论我如何编写它都会出现各种错误。这是我的查询的样子:
SELECT [Employee_FullName],
SUBSTRING(col, 1, CHARINDEX(' ', col + ' ' ) -1)'Code',
hrsValue
FROM
(
SELECT [Employee_FullName], col, hrsValue
FROM myTable
CROSS APPLY
(
VALUES ([Code],[RegularHours])
) C (COL, hrsValue)
) SRC
感谢任何有关如何修复它的建议或对使用什么的看法!
编辑:我无法更改逗号分隔的数据,它是以这种方式提供的。我认为交叉申请中的案例会解决它,但老实说我不知道。
编辑 2:我将使用唯一的 EmployeeID 来识别他们。在这种情况下,是 A 是常规时间,B 是双倍时间,C 是加班时间。复杂之处在于,每种类型的时间都有多种不同的代码和多个指代。永远不会有 A 会指代一名员工的正常时间和另一名员工的双倍时间等。我在 SQL Server 2017 上。谢谢大家的时间!
【问题讨论】:
-
有没有案例在你尝试? Show 向我们展示这个案例的尝试。
-
我不知道从哪里开始放一个箱子。我尝试创建一个临时变量来保存一个代表代码的值,但是我必须找到一种方法让它读取逗号分隔的列。这是最好的方法吗?
-
您可以在
VALUES语句中将列名替换为大小写表达式。 -
如果您想让人们真正轻松地提供帮助,请为您的示例数据提供 DDL+DML。
-
什么版本的 SQL Server?您还可以提供一些示例数据/加班所需的结果吗?如果你有两个 John Do,会发生什么?您真的使用 FullName 来识别员工吗?
标签: sql sql-server tsql