Просмотров в SQL - PullRequest
       20

Просмотров в SQL

0 голосов
/ 17 февраля 2020

Я пытаюсь написать запрос, который будет выдавать описание для каждого сегмента кода учетной записи. Таблица выглядит следующим образом:

Current Table

Я хочу, чтобы каждый раздел CTR C выдвигал CTDES C для CTACCT, соответствующего примеру:

Results I want

Мои исходные данные содержат более 4 миллионов строк, поэтому я не могу экспортировать в excel для нормального Vlookup. У меня есть только одна таблица со всеми этими данными, и я не смог самостоятельно объединиться, чтобы иметь возможность извлекать все строки. Я могу делать это только по одному разделу за раз.

SELECT TOP 10
       RTRIM(a.CTACCT) AS [CTACCT],
       RTRIM(a.CTRC01) AS [CTRC01],
       NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02)), CONCAT(RTRIM(a.CTrc01), '-')) AS [CTRC02],
       NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-')) AS [CTRC03],
       NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-')) AS [CTRC04],
       NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-')) AS [CTRC05],
       NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05), '-', RTRIM(a.CTrc06)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05), '-')) AS [CTRC06],
       a.CTDESC AS [CTDESC],
       a.CTSEGN AS [CTSEGN]
FROM [PSA].[dbo].[SMFD35_GLDBFA_GLPCT] a WITH (NOLOCK);

Я использую SQL Сервер.


1 Ответ

0 голосов
/ 17 февраля 2020

Есть несколько способов сделать это, так как у вас уже есть значения в ваших таблицах, один из подходов заключается в добавлении поля id из исходной таблицы и тега, который CTR C (LevelNr) соответствует CTACCT в результатах :

select A.CTACCT, max(B.CTRC01) AS CTRC01, 
  max(case when B.LevelNr = 1 then B.Description else null end) AS CTRC01_Description,
  max(case when A.LevelNr >=2 then B.CTRC02 else null end) AS CTRC02, 
  max(case when A.LevelNr >=2 and B.LevelNr = 2 then B.Description else null end) AS CTRC02_Description,
  max(case when A.LevelNr >=3 then B.CTRC03 else null end) AS CTRC03, 
  max(case when A.LevelNr >=3 and B.LevelNr = 3 then B.Description else null end) AS CTRC03_Description
from @MyResults A
  inner join @MyResults B on A.id = B.id
group by A.[CTACCT], A.id, A.LevelNr
order by A.[CTACCT], A.id, A.LevelNr

Результаты:

CT_ACCT        CTRC01 CTRC01_Description CTRC02   CTRC02_Description CTRC03        CTRC03_Description
001            001    Company            NULL     NULL               NULL          NULL
001-0000       001    Company            001-0000 Department         NULL          NULL
001-0000-0000  001    Company            001-0000 Department         001-0000-0000 Location

Это действительно должно быть обсуждение дизайна базы данных. Если у вас есть данные, в которых каждое значение CTR C хранится отдельно, то здесь вступают в действие функции группировки, такие как STRING_AGG () и PIVOT.

Предполагая, что вы можете получить свои данные в состоянии, как показано ниже, с помощью запросов UNION:

id RowNr CTAcct
1  1     001
1  2     0000
1  3     0000
2  1     002
2  2     0000
2  3     0000

Затем вы можете собрать все номера и описания своих счетов, как показано ниже (STRING_AGG лучше, но FOR XML подойдет для вашей версии):

select [CTACCT], id, RowNr, Description
from
(
select RowNr, id,
  STUFF((SELECT '-' + [CTACCT]
    from @CTACCTS A where A.[id] = T.[id] and A.[RowNr] <= T.[RowNr]
    FOR XML PATH('')),1, 1,'') as [CTACCT]
from @CTACCTS T
) A left join @CTDESCRIPTIONS D ON A.[CTACCT] = D.[CTACCT]

Результаты:

CTACCT        id RowNr Description
001           1  1     Company
001-0000      1  2     Department
001-0000-0000 1  3     Location

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

Конечно, вы также можете выполнить серию операторов обновления, но обычно в SQL Server не рекомендуется использовать подпрограммы, не основанные на множестве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...