Запросить возврат значения записи в столбце вместо строки? - PullRequest
0 голосов
/ 03 мая 2018

Мне нужна помощь в создании запроса. У меня есть таблица клиента с уникальной информацией о клиенте, идентифицируемая по уникальному идентификатору клиента. У меня также есть таблица Client_UserDefinedFields, которая содержит значения пользовательских данных для клиентов. Они связаны через ClientID, и в таблице Client_UserDefinedFields может быть много записей для ClientID.

Моя ситуация такова, что есть 3 пользовательских поля данных, в которых мне нужно знать значения для данного клиента (как показано в моей инструкции CASE). Мой текущий запрос возвращает клиента 3 раза (строка для каждого значения), и я хочу видеть клиента только один раз (одну строку), и эти значения отображаются в виде столбцов. Не уверен, если это возможно или как к этому. Кроме того, когда я попытался использовать оператор CASE в своем выборе, я не могу использовать AS 'fieldname' для его идентификации - так как он дает мне ошибку по ключевому слову AS.

Пример моего текущего оператора SQL SELECT

    SELECT
        c.ClientID
      , c.LastName
      , c.FirstName
      , c.MiddleName
      , CASE WHEN cudf.UserDefinedFieldFormatULink = '93fb3820-38aa-4655-8aad-a8dce8aede' THEN cudf.UDF_ReportValue --AS 'DA Status'
             WHEN cudf.UserDefinedFieldFormatULink = '2144a742-08c5-4c96-b9e4-d6f1f56c76' THEN cudf.UDF_ReportValue --AS 'FHAP Status'
             WHEN cudf.UserDefinedFieldFormatULink = 'c3d29be9-af58-4241-a02d-9ae9b43ffa' THEN cudf.UDF_ReportValue --AS 'HCRA Status'
        END
    FROM Client_Program cp
    INNER JOIN client c ON c.ulink = cp.clientulink
    INNER JOIN code_program p ON p.ulink = cp.programulink
    INNER JOIN Code_System_State css ON c.ContactMailingStateUlink = css.ulink 
    INNER JOIN Code_ClientStatus ccs ON c.ClientStatusULink = ccs.ULink
    INNER JOIN Client_UserDefinedField cudf ON c.ULink = cudf.ClientULink
    AND cp.ProgramStatusULink = '1' -- Open (active) program
    AND c.ClientStatusULink = '10000000' --Active client
    AND cp.programulink in ('7280f4a7-cd94-49be-86ad-a74421ff6f',
      '0a9b94a3-edd7-4918-b79c-bf2b20f9da',
      '54f6c691-2eba-49e5-8380-85f5349bca',
      'ed8c497d-d4fe-41d7-a218-4235fd0734',
      '5be826f0-b3c3-4ebe-871d-4d20b56da5')
     AND cudf.UserDefinedFieldFormatULink IN ('93fb3820-38aa-4655-8aad-a8dce8aede', -- DA Status
                                              '2144a742-08c5-4c96-b9e4-d6f1f56c76', --FHAP Status
'c3d29be9-af58-4241-a02d-9ae9b43ffa') --HCRA Status

Опять же, моя проблема в том, что я не хочу возвращать одного и того же клиента несколько раз, если у него было более одной записи в таблице Client_UserDefinedFields. Я хотел бы привести это в один ряд, чтобы каждое поле «Состояние» было правильно заполнено в виде столбцов. Как мне это сделать? Вот пример моего текущего выхода:

ClientID        LastName    FirstName   MiddleName  PCHP/HCH Status DA Status   FHAP Status         HCRA Status         
XXXXXXXXXXXX    River       Mike        Allan       Active          (null)      - None Selected -   (null)              
XXXXXXXXXXXX    River       Mike        Allan       Active          Active      (null)              (null)              
XXXXXXXXXXXX    River       Mike        Allan       Active          (null)      (null)              - None Selected -   

В конечном итоге хотелось бы видеть только одну запись со всеми значениями

ClientID        LastName    FirstName   MiddleName  PCHP/HCH Status DA Status   FHAP Status         HCRA Status         
XXXXXXXXXXXX    River       Mike        Allan       Active          Active      - None Selected -   - None Selected -

Примеры очень полезны, так как я не гуру SQL. Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Если я правильно понял вашу проблему, то со стороны ниже есть решение

 SELECT DISTINCT
    c.ClientID
  , c.LastName
  , c.FirstName
  , c.MiddleName
  , (CASE WHEN cudf.UserDefinedFieldFormatULink = '93fb3820-38aa-4655-8aad-a8dce8aede' THEN cudf.UDF_ReportValue ELSE NULL END)  AS 'DA Status'
    ,(CASE WHEN cudf.UserDefinedFieldFormatULink = '2144a742-08c5-4c96-b9e4-d6f1f56c76' THEN cudf.UDF_ReportValue ELSE NULL END)  AS 'FHAP Status'
    ,(CASE WHEN cudf.UserDefinedFieldFormatULink = 'c3d29be9-af58-4241-a02d-9ae9b43ffa' THEN cudf.UDF_ReportValue ELSE NULL END) AS 'HCRA Status'

FROM Client_Program cp
INNER JOIN client c ON c.ulink = cp.clientulink
INNER JOIN code_program p ON p.ulink = cp.programulink
INNER JOIN Code_System_State css ON c.ContactMailingStateUlink = css.ulink 
INNER JOIN Code_ClientStatus ccs ON c.ClientStatusULink = ccs.ULink
INNER JOIN Client_UserDefinedField cudf ON c.ULink = cudf.ClientULink
AND cp.ProgramStatusULink = '1' -- Open (active) program
AND c.ClientStatusULink = '10000000' --Active client
AND cp.programulink in ('7280f4a7-cd94-49be-86ad-a74421ff6f',
  '0a9b94a3-edd7-4918-b79c-bf2b20f9da',
  '54f6c691-2eba-49e5-8380-85f5349bca',
  'ed8c497d-d4fe-41d7-a218-4235fd0734',
  '5be826f0-b3c3-4ebe-871d-4d20b56da5')
 AND cudf.UserDefinedFieldFormatULink IN ('93fb3820-38aa-4655-8aad-a8dce8aede', -- DA Status
                                          '2144a742-08c5-4c96-b9e4-d6f1f56c76')--FHAP Status
0 голосов
/ 03 мая 2018
SELECT c.ClientID,
   c.LastName,
   c.FirstName,
   c.MiddleName,
   CASE
       WHEN cudf.UserDefinedFieldFormatULink = '93fb3820-38aa-4655-8aad-a8dce8aede' THEN
           cudf.UDF_ReportValue AS 'DA Status'
       WHEN cudf.UserDefinedFieldFormatULink = '2144a742-08c5-4c96-b9e4-d6f1f56c76' THEN
           cudf.UDF_ReportValue AS 'FHAP Status'
       WHEN cudf.UserDefinedFieldFormatULink = 'c3d29be9-af58-4241-a02d-9ae9b43ffa' THEN
           cudf.UDF_ReportValue AS 'HCRA Status'
   END
INTO #Temp
FROM Client_Program cp
INNER JOIN client c
    ON c.ulink = cp.clientulink
INNER JOIN code_program p
    ON p.ulink = cp.programulink
INNER JOIN Code_System_State css
    ON c.ContactMailingStateUlink = css.ulink
INNER JOIN Code_ClientStatus ccs
    ON c.ClientStatusULink = ccs.ULink
INNER JOIN Client_UserDefinedField cudf
    ON c.ULink = cudf.ClientULink
       AND cp.ProgramStatusULink = '1' -- Open (active) program
       AND c.ClientStatusULink = '10000000' --Active client
       AND cp.programulink IN ( '7280f4a7-cd94-49be-86ad-a74421ff6f', '0a9b94a3-edd7-4918-b79c-bf2b20f9da',
                                '54f6c691-2eba-49e5-8380-85f5349bca', 'ed8c497d-d4fe-41d7-a218-4235fd0734',
                                '5be826f0-b3c3-4ebe-871d-4d20b56da5'
                              )
       AND cudf.UserDefinedFieldFormatULink IN (   '93fb3820-38aa-4655-8aad-a8dce8aede', -- DA Status
                                                   '2144a742-08c5-4c96-b9e4-d6f1f56c76'
                                               ); --FHAP Status

SELECT COALESCE(A.CilentID, B.ClientID, C.ClientID),LastName,
   FirstName, MiddleName, [DA Status], [FHAP Status], [HCRA Status] FROM 
(SELECT ClientID, LastName, FirstName, [DA Status] FROM #Temp WHERE [DA Status] IS NOT NULL) AS A FULL OUTER JOIN  
(SELECT ClientID, LastName, FirstName, [FHAP Status] FROM #Temp WHERE [FHAP Status] IS NOT NULL) AS B ON A.ClientID = B.ClientID FULL OUTER JOIN 
(SELECT ClientID, LastName, FirstName, [HCRA Status] FROM #Temp WHERE [HCRA Status] IS NOT NULL) AS C ON C.ClientID = A.ClientID
0 голосов
/ 03 мая 2018

Это непроверенный код, но команда PIVOT будет работать:

SELECT
c.ClientID
, c.LastName
, c.FirstName
, c.MiddleName
, CASE WHEN cudf.UserDefinedFieldFormatULink = '93fb3820-38aa-4655-8aad-a8dce8aede' THEN cudf.UDF_ReportValue --AS 'DA Status'
     WHEN cudf.UserDefinedFieldFormatULink = '2144a742-08c5-4c96-b9e4-d6f1f56c76' THEN cudf.UDF_ReportValue --AS 'FHAP Status'
     WHEN cudf.UserDefinedFieldFormatULink = 'c3d29be9-af58-4241-a02d-9ae9b43ffa' THEN cudf.UDF_ReportValue --AS 'HCRA Status'
   END
 FROM Client_Program cp
INNER JOIN code_program p ON p.ulink = cp.programulink
INNER JOIN Code_System_State css ON c.ContactMailingStateUlink = css.ulink 
INNER JOIN Code_ClientStatus ccs ON c.ClientStatusULink = ccs.ULink
INNER JOIN client c ON c.ulink = cp.clientulink
INNER JOIN (
    select * 
    from ( select ClientULink, UserDefinedFieldFormatULink , ROW_NUMBER() OVER (PARTITION BY ClientULink ORDER BY (SELECT NULL)) RN
            from Client_UserDefinedField
            where UserDefinedFieldFormatULink IN ('93fb3820-38aa-4655-8aad-a8dce8aede', -- DA Status
                 '2144a742-08c5-4c96-b9e4-d6f1f56c76')--FHAP Status
        ) as c
        PIVOT (
            MAX(UserDefinedFieldFormatULink) FOR RN IN ([1],[2],[3])
        ) as pvt
    ) cudf ON c.ULink = cudf.ClientULink
AND cp.ProgramStatusULink = '1' -- Open (active) program
AND c.ClientStatusULink = '10000000' --Active client
AND cp.programulink in ('7280f4a7-cd94-49be-86ad-a74421ff6f',
   '0a9b94a3-edd7-4918-b79c-bf2b20f9da',
  '54f6c691-2eba-49e5-8380-85f5349bca',
  'ed8c497d-d4fe-41d7-a218-4235fd0734',
  '5be826f0-b3c3-4ebe-871d-4d20b56da5')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...