Соединение нескольких таблиц приводит к дублированию строк - PullRequest
0 голосов
/ 30 августа 2018

Существуют буксирные столы (Customer & Feedback), которые имеют различную информацию. Следующий запрос является почти правильным, за исключением того, что он приводит к дублированию строк. Мне нужны только уникальные строки как par customerId и NO для нулевого значения.

В конце я попробовал предложение GROUP BY, но оно выдает ошибку.

Select C.CustomerId, 
       C.FirstName, 
       C.LastName, 
       (SELECT CAST(CASE WHEN F.Id != null or F.Type = 'Query' 
                         THEN 'YES' ELSE 'NO' END AS NVARCHAR(50))) as Query,
       (SELECT CAST(CASE WHEN F.Id != null or F.Type = 'Feedback' 
                         THEN 'YES' ELSE 'NO' END AS NVARCHAR(50))) as Feedback
FROM Customer C
LEFT JOIN Feedback F on  F.CustomerId= C.CustomerId

enter image description here

Select * from Customer

enter image description here

Select * from Feedback

enter image description here

В результате я хочу отобразить только одну строку по customerId и объединить данные таблицы обратной связи, как показано ниже ... enter image description here

Ответы [ 5 ]

0 голосов
/ 30 августа 2018

Попробуйте это:

select c.CustomerId,
       c.FirstName,
       c.LastName,
       case when q.CustomerId is null then 'NO' else 'YES' end Query,
       case when f.CustomerId is null then 'NO' else 'YES' end Feedback,
from Customers c
left join (select customerId from Feedback where Type = 'Query' ) q on c.CustomerId = q.CustomerId
left join (select customerId from Feedback where Type = 'Feedback' ) f on c.CustomerId = q.CustomerId
0 голосов
/ 30 августа 2018

Вы можете попробовать любой из ниже

SELECT
    C.*,
    Query = CASE WHEN PVT.Query IS NOT NULL THEN 'Yes' ELSE 'No' END,
    Feedback = CASE WHEN PVT.Feedback IS NOT NULL THEN 'Yes' ELSE 'No' END
    FROM Customer C
        LEFT JOIN  FeedBack
            PIVOT
            (
                MAX(Id)
                FOR
                [Type] IN
                (
                    [Query],[Feedback]
                )
            )Pvt
            ON PVT.CustomerId = c.CustomerId

или просто

SELECT
    C.*,
    Query = CASE WHEN EXISTS(SELECT 1 FROM FeedBack WHERE CustomerId = C.CustomerId and [Type]='Query') THEN 'Yes' ELSE 'No' END,
    Feedback = CASE WHEN EXISTS(SELECT 1 FROM FeedBack WHERE CustomerId = C.CustomerId and [Type]='Feedback') THEN 'Yes' ELSE 'No' END
    FROM Customer C

Чтобы сделать его более динамичным, попробуйте

DECLARE @SQL VARCHAR(MAX)

;WITH CTE
AS
(
    SELECT
        RN = ROW_NUMBER() OVER(PARTITION BY [Type] ORDER BY [Type]),
        QRY = LTRIM(RTRIM([Type]))+' = CASE WHEN EXISTS(SELECT 1 FROM FeedBack WHERE CustomerId = C.CustomerId and [Type]='''+LTRIM(RTRIM([Type]))+''') THEN ''Yes'' ELSE ''No'' END'
        FROM FeedBack
)
SELECT
    @SQL = 'SELECT
    C.*'
    +SUBSTRING(','+L.List,1,LEN(L.List)-1)
    +' FROM Customer C'
    FROM 
    (
        SELECT
            QRY + ', ' [text()]
            FROM CTE
                WHERE RN = 1
                FOR XML PATH('')
    )L(List)

EXEC(@SQL)

Пожалуйста, обратитесь к этому Sqlfiddle для подробного примера

0 голосов
/ 30 августа 2018
Select C.CustomerId, 
       C.FirstName, 
       C.LastName, 
       sum(case when F.Type = 'Query' then 1 else 0 end) > 0 as Query,
       sum(case when F.Type = 'Feedback' then 1 else 0 end) > 0 as Feedback
FROM Customer C
LEFT JOIN Feedback F on  F.CustomerId= C.CustomerId
GROUP BY C.CustomerId, C.FirstName, C.LastName
0 голосов
/ 30 августа 2018

использование case when

Select C.CustomerId, 
       C.FirstName, 
       C.LastName, 
       case when sum(case when F.Type = 'Query' then 1 else 0 end) > 0  then 'Yes' else 'NO' end as Query,
    case when   sum(case when F.Type = 'Feedback' then 1 else 0 end) > 0 then 'Yes' else 'NO' End as Feedback
FROM Customer C
LEFT JOIN Feedback F on  F.CustomerId= C.CustomerId
GROUP BY C.CustomerId, C.FirstName, C.LastName
0 голосов
/ 30 августа 2018

Попробуйте запрос ниже, используя подзапрос:

    select *,case when query=1 then 'Yes' else 'No' end as query, 
case when feedback=1 then 'Yes' else 'No' end as feedbackfrom
(select CustomerId, firstname,lastname,
        sum(CASE WHEN Type = 'Query' 
             THEN 1 ELSE 0 END) as Query,

        sum(CASE WHEN Type = 'Feedback' 
             THEN 1 ELSE 0 END)  as Feedback from Customer C
        LEFT JOIN Feedback F on  F.CustomerId= C.CustomerId
group by CustomerId, firstname,lastname)a
...