Sql server SQL Server:创建转置表并与现有表联接
我有一组来自表[MSPWIP].[MSPWIP].[Event]的数据,如下所示:Sql server SQL Server:创建转置表并与现有表联接,sql-server,sql-insert,create-table,jointable,Sql Server,Sql Insert,Create Table,Jointable,我有一组来自表[MSPWIP].[MSPWIP].[Event]的数据,如下所示: | Createdby | StationName | SerialNumber | ------------------------------------------------------- | Jay | L1.A1 | 22191321572 | | Allan | L1.A2 | 22191321572 | | Nathan | L2.A1
| Createdby | StationName | SerialNumber |
-------------------------------------------------------
| Jay | L1.A1 | 22191321572 |
| Allan | L1.A2 | 22191321572 |
| Nathan | L2.A1 | 22191321579 |
| Jane | L2.A2 | 22191321579 |
我还有其他数据集,我已经加入到另一个查询中,这与问题无关
我想创建一个表,将操作符(由createdby表示)按站点分隔,例如,L1.A1表示1号线站点1。目前对我来说,这条线并不重要
我重组后的理想数据应该是这样的
| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572 | Jay | Allan |
| 22191321579 | Nathan | Jane |
我尝试使用此代码连接两个表:
问题#1
然后,我想使用下面的代码将其与另一个查询连接起来:
问题2
- 请注意,a是一个不同的表
| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572 | Jay | Allan |
| 22191321579 | Nathan | Jane |
问题3
然而,我的结果现在变得如此错乱:
| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572 | Jay | NULL |
| 22191321572 | NULL | Allan |
| 22191321579 | Nathan | NULL |
| 22191321579 | NULL | Jane |
我在这里做错了什么吗?您可以通过这样一次跑步来节省时间:
SELECT *
FROM (
SELECT
SerialNumber
, MAX(CASE WHEN RIGHT(t.StationName, 2) = '01' THEN t.Operator END) Operator1
, MAX(CASE WHEN RIGHT(t.StationName, 2) = '02' THEN t.Operator END) Operator2
FROM [MSPWIP].[MSPWIP].[Event] t
GROUP BY SerialNumber
) d
然后,您只需将它与所需的表连接起来
注意:如果您在
StationName
中的站点部分不总是一个数字,那么您可以使用子字符串(t.StationName,CHARINDEX('.',t.StationName)+1,LEN(t.StationName))
而不是右(t.StationName,2)
来获取站点部分(在点之后) 非常感谢,代码可以正常工作,但是我遇到了一个问题,当将station name的Varchar转换为int时,转换失败。我应该澄清,“station name”中的数据可以包含最后2位的字母,上面的数据是任意示例。很抱歉。我注意到Max和Cast语法返回int,是否有任何东西返回Varchar?@EugeneKwokKitHo检查编辑,这应该可以解决问题,但是,如果你的站名可以超过2个字符,请阅读P.S,改用SUBSTRING
方法。当StationName类似于X时,我设法使用case,并让操作符显示。非常感谢。然而,我的结果似乎是交错的(运算符1和2显示在不同的行中,而另一个运算符显示为空)。我已经更新了我的问题陈述。您好,它现在与您的PS完美配合,谢谢@EugeneKwokKitHo很乐意帮助,只是mark回答说,帮助其他研究人员。
| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572 | Jay | NULL |
| 22191321572 | NULL | Allan |
| 22191321579 | Nathan | NULL |
| 22191321579 | NULL | Jane |
SELECT *
FROM (
SELECT
SerialNumber
, MAX(CASE WHEN RIGHT(t.StationName, 2) = '01' THEN t.Operator END) Operator1
, MAX(CASE WHEN RIGHT(t.StationName, 2) = '02' THEN t.Operator END) Operator2
FROM [MSPWIP].[MSPWIP].[Event] t
GROUP BY SerialNumber
) d