Вывод выражения SQL Server для текста в несколько столбцов

Другой Caseвопрос выражения, я использую SQL Server 2016.

Я пытаюсь вернуть 1 строку для каждого свойства с несколькими столбцами клиентов. Если у объекта есть 1 клиент, то 2-й и 3-й столбцы клиента должны быть нулевыми. Я использовал соединение в той же таблице, чтобы вернуть клиента RANKпротив свойства, но мой результат возвращает несколько строк для каждого свойства.

Желаемый результат:

Prop    Cust1   Cust2   Cust3
-------------------------------
PropA   Fred    John    NULL
PropB   Ang     Jo      Allan

Запрос:

SELECT DISTINCT
    x.Property as Prop,
    CASE WHEN x.RANK = 1 THEN x.Customer END AS Cust1,
    CASE WHEN x.RANK = 2 THEN x.Customer END AS Cust2,
    CASE WHEN x.RANK = 3 THEN x.Customer END AS Cust3
FROM 
    tbl_CustbyProperty c
LEFT JOIN
    (SELECT DISTINCT  
         Cust_ID, Customer, Property
         ROW_NUMBER() OVER (PARTITION BY c.Property ORDER BY c.customer) AS RANK
     FROM 
         tbl_CustbyProperty) x ON c.Cust_ID = x.Cust_ID
ORDER BY 
    y x.Property

Токовый выход:

Prop     Cust1   Cust2   Cust3
--------------------------------
PropA    Fred    NULL    NULL
PropA    NULL    John    NULL
PropB    Ang     NULL    NULL
PropB    NULL    Jo      NULL
PropB    NULL    NULL    Allan

sql-server,case,

0

Ответов: 1


0 принят

Чтобы перейти от текущего результата желаемого результата вы могли GROUP BY x.propertyи получить max()в CASEс. Что-то похожее:

SELECT x.property prop,
       max(CASE 
             WHEN x.rank = 1 THEN
               x.customer
           END) cust1,
       max(CASE
             WHEN x.rank = 2 THEN
               x.customer
           END) cust2,
       max(CASE
             WHEN x.rank = 3 THEN
               x.customer
           END) cust3
       FROM tbl_custbyproperty c
            LEFT JOIN (SELECT DISTINCT
                              cust_id,
                              customer,
                              property,
                              row_number() OVER (PARTITION BY c.property
                                                 ORDER BY c.customer) rank
                              FROM tbl_custbyproperty) x
                      ON c.cust_id = x.cust_id
       GROUP BY x.property
       ORDER BY x.property;

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

SQL-сервер, случай,
Похожие вопросы