Я пытаюсь объединить несколько таблиц вместе. Одна из таблиц, к которой я пытаюсь присоединиться, содержит сотни строк на идентификатор данных. Я пытаюсь повернуть около 100 строк для каждого идентификатора в столбцы. Значение, которое я пытаюсь использовать, не всегда находится в одной строке. Ниже приведен пример (у моей реальной таблицы есть сотни строк на ID). AccNum, например, в ID 1, может быть в столбце NumV, но для ID 2 он может находиться в столбце CharV.более эффективно свернуть строки
ID QType CharV NumV
1 AccNum 10
1 EmpNam John Inc 0
1 UW Josh 0
2 AccNum 11
2 EmpNam CBS 0
2 UW Dan 0
оригинальный код, который я использовал, был оператор выбора с сотнями линий, как один ниже:
Max(Case When PM.[QType] = 'AccNum' Then NumV End) as AccNum
Этот код с сотнями на линиях завершена в чуть менее 10 мин. Однако проблема заключается в том, что только вытягивает значения из указанного столбца, поэтому я всегда буду потерять данные, находящиеся в другом столбце. (В приведенном выше примере я бы получил AccNum 10, но не AccNum11, потому что он находится в столбце CharV).
Я обновил код, чтобы использовать стержень:
;with CTE
As
(
Select [PMID], [QType],
Value=concat(Nullif([CharV],''''),Nullif([NumV],0))
From [DBase].[dbo].[PM]
)
Select C.[ID] AS M_ID
,Max(c.[AccNum]) As AcctNum
,Max(c.[EmpNam]) As EmpName
и так далее ...
Я тогда выбрать все мои сотни строк, а затем повернуть его данные:
from CTE
pivot (max(Value) for [QType] in ([AccNum],[EmpNam],(more rows)))As c
Проблема с этим кодом состоит в том, что для запуска требуется почти 2 часа.
Есть ли другое, более эффективное решение того, что я пытаюсь выполнить? Мне нужно иметь скорость первого кода, но результат второго.
Предположительно (вы можете проверить, хотя) это стержень, который берет время, а не КТР однако я ожидаю, что вы можете упростить Value = строку в КТР с COALESCE ([CharV], [NumV], 0), см., если это имеет какой-либо эффект. – Rikalous
К сожалению, это не сработает, потому что ни одно из полей не является истинным. Если CharV не имеет значения, то это пустая строка «», и если NumV не имеет значения, то это просто 0. –