Значение столбца SQL GROUP BY - PullRequest
0 голосов
/ 13 декабря 2018

При выборе нижеприведенных данных я хочу сделать так, чтобы я мог группировать по столбцам так, чтобы было все "Y".На изображении ниже показано, как это выглядит в настоящее время:

enter image description here

enter image description here

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

SELECT p.FirstName
    ,p.Surname
    ,CASE
        WHEN a.ActivityName = 'Jumping' THEN 'Y'
        ELSE 'N'
    END AS 'Jumping'
    ,CASE
        WHEN a.ActivityName = 'Dancing' THEN 'Y'
        ELSE 'N'
    END AS 'Dancing'
    ,CASE
        WHEN a.ActivityName = 'Walking' THEN 'Y'
        ELSE 'N'
    END AS 'Walking'
FROM #TempActivity a 
    INNER JOIN #TempPerson p ON a.AID = p.ActivityID
WHERE FirstName = 'John'
    AND Surname = 'Smith'

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

CREATE TABLE #TempActivity(
AID INT
,ActivityName VARCHAR(100)
)

CREATE TABLE #TempPerson(
PID INT
,FirstName VARCHAR(100)
,Surname VARCHAR(100)
,ActivityID INT
)

INSERT INTO #TempActivity
VALUES (1,'Jumping')
    ,(2,'Dancing')
    ,(3,'Walking')

INSERT INTO #TempPerson
VALUES (1,'John', 'Smith', 1)
    ,(2,'John', 'Smith', 2)
    ,(3,'John', 'Smith', 3)
    ,(4,'Jane','Smith', 1)
    ,(5,'Jane','Smith', 2)

SELECT * FROM #TempActivity
SELECT * FROM #TempPerson

SELECT p.FirstName
    ,p.Surname
    ,a.ActivityName
  FROM #TempActivity a 
INNER JOIN #TempPerson p ON a.AID = p.ActivityID
  WHERE FirstName = 'John'
AND Surname = 'Smith'

SELECT p.FirstName
    ,p.Surname
    ,CASE
        WHEN a.ActivityName = 'Jumping' THEN 'Y'
        ELSE 'N'
    END AS 'Jumping'
    ,CASE
        WHEN a.ActivityName = 'Dancing' THEN 'Y'
        ELSE 'N'
    END AS 'Dancing'
    ,CASE
        WHEN a.ActivityName = 'Walking' THEN 'Y'
        ELSE 'N'
    END AS 'Walking'
    FROM #TempActivity a 
INNER JOIN #TempPerson p ON a.AID = p.ActivityID
WHERE FirstName = 'John'
AND Surname = 'Smith'

DROP TABLE #TempActivity;
DROP TABLE #TempPerson;

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018
SELECT p.FirstName
    ,p.Surname
    ,CASE WHEN SUM(CASE
        WHEN a.ActivityName = 'Jumping' THEN 1
        ELSE 0 END) > 0 THEN 'Y' 
        ELSE 'N' 
    END AS 'Jumping'
    ,CASE WHEN SUM(CASE
        WHEN a.ActivityName = 'Dancing' THEN 1
        ELSE 0 END) > 0 THEN 'Y' 
        ELSE 'N'
    END AS 'Dancing'
    ,CASE WHEN SUM(CASE
        WHEN a.ActivityName = 'Walking' THEN 1
        ELSE 0 END) > 0 THEN 'Y' 
        ELSE 'N'
    END AS 'Walking'
FROM #TempActivity a 
    INNER JOIN #TempPerson p ON a.AID = p.ActivityID
WHERE FirstName = 'John'
    AND Surname = 'Smith'
GROUP BY FirstName, SurName
0 голосов
/ 13 декабря 2018

Вы можете просто использовать max():

select firstname, surname, max(jumping) as jumping,
       max(dancing) as dancing, max(walking) as walking
from #TempActivity a join
     #TempPerson p 
     on a.AID = p.ActivityID
where FirstName = 'John' and Surname = 'Smith'
group by firstname, surname;
...