SQL Server: создание транспонированной таблицы и объединение с существующей таблицей - PullRequest
0 голосов
/ 04 июня 2019

У меня есть набор данных из таблицы [MSPWIP]. [MSPWIP]. [Event], который выглядит следующим образом:

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

И у меня есть другие наборы данных, которые я уже включил в другой запрос, который не имеет отношения к проблеме

Я хочу создать таблицу, разделяющую оператора (обозначается созданным by) станциями, где L1.A1 означает, например, Line 1 Station 1. Для меня на данный момент Линия не актуальна

Мои идеальные данные после реструктуризации должны выглядеть следующим образом

| 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 Ответ

1 голос
/ 04 июня 2019

Вы можете сэкономить свое время, выполнив его за один раз, например:

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 

тогда вы просто присоединитесь к нему с необходимыми таблицами.

P.S: Если ваша часть станции в StationName не всегда является числом, то вы можете использовать SUBSTRING(t.StationName, CHARINDEX('.', t.StationName) + 1, LEN(t.StationName)) вместо RIGHT(t.StationName, 2), чтобы получить часть станции (которая находится после точки).

...