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

时间:2019-06-03 23:40:26

标签: sql-server sql-insert create-table jointable

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

| Createdby | StationName | SerialNumber |
-------------------------------------------------------
|   Jay     |    L1.A1    | 22191321572  |
|   Allan   |    L1.A2    | 22191321572  |
|   Nathan  |    L2.A1    | 22191321579  |
|   Jane    |    L2.A2    | 22191321579  |

我还有其他与问题无关的查询中已经加入的其他数据集

我想创建一个表,其中按L1.A1表示1号线1号站的站将操作员(用createdby表示)分开。目前对我而言,Line不相关

重组后的理想数据应该像这样

| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572  |    Jay    |   Allan   |
| 22191321579  |   Nathan  |   Jane    |

我尝试使用此代码连接两个表:

查询#1

Declare @Operator1 Table(
SerialNumber Varchar(255),
Operator1 Varchar(255)
)

Insert Into @Operator1 (Serialnumber, Operator1)
Select 
SerialNumber,
Createdby as Operator1
From [MSPWIP].[MSPWIP].[Event]
where StationName like '%01'

Declare @Operator2 Table(
SerialNumber Varchar(255),
Operator2 Varchar(255)
)

Insert Into @Operator2 (Serialnumber, Operator2)
Select 
SerialNumber,
CreatedBy as Operator2
From [MSPWIP].[MSPWIP].[Event]
where StationName like '%02'

select 
a.SerialNumber,
CreatedBy,
b.Operator2

From @Operator1 a
join @Operator2 b
On a.SerialNumber = b.SerialNumber

Where a.SerialNumber In ('22191321572', '22191321574')

然后我想使用下面的代码将其与其他查询一起加入

查询#2

join @Operator1 i
on a.SerialNumber = i.SerialNumber
join @Operator2 j
on a.SerialNumber = j.SerialNumber
  • 请注意,a是不同的表。

但是对于Query#1,它仅设法显示标题而不是数据,这也导致Query#2也显示了标题,而没有其他显示。

只是想知道Query#1是否有问题,无法将数据插入列中?

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

更新:

使用下面的答案(带有修改),我想到了这样的代码

查询#3

SELECT Distinct*
FROM (
    SELECT distinct
        SerialNumber,
        Case When t.StationName like '%A1' then CreatedBy End Operator1,
        Case When t.StationName like '%A2' then CreatedBy End Operator2
    --,   Max(CASE WHEN CAST(RIGHT(t.StationName, 1) AS Varchar(255)) = 1 THEN t.CreatedBy END) Operator1 
    --,   Max(CASE WHEN CAST(RIGHT(t.StationName, 1) AS Varchar(255)) = 2 THEN t.CreatedBy END) Operator2 
    FROM [MSPWIP].[MSPWIP].[Event] t
    where t.CreatedDate > '2019-05-30'
    Group BY SerialNumber, StationName, Createdby
) d 

但是我的结果现在变得像这样交错:

| SerialNumber | Operator1 | Operator2 |
----------------------------------------
| 22191321572  |    Jay    |   NULL    |
| 22191321572  |    NULL   |   Allan   |
| 22191321579  |   Nathan  |   NULL    |
| 22191321579  |    NULL   |   Jane    |

我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

您可以通过一次运行来节省时间:

MicrosoftAppPassword

然后将其与所需的表连接起来。

PS:如果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而不是SUBSTRING(t.StationName, CHARINDEX('.', t.StationName) + 1, LEN(t.StationName))来获得桩号(位于圆点后) 。