Sql server SQL Server:创建转置表并与现有表联接

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

我有一组来自表[MSPWIP].[MSPWIP].[Event]的数据,如下所示:

| 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是一个不同的表
然而,对于查询#1,它只显示标题而不显示数据,这也导致查询#2也显示标题而不显示其他内容

只是想知道查询#1中的数据未能插入到列中是否有问题

============================================

更新: 使用下面的答案(经过修改),我想出了这样一个代码

| 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