рассчитывать людей, которые также имеют двойное гражданство - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь подсчитать количество людей, которые приезжают из разных стран на сервере sql.Но у некоторых людей есть двойное гражданское судно.Как написать запрос с учетом двойного гражданства и подсчитать количество людей в обеих странах.

Пример:

ID  CITIZENSHIP DUAL CITIZENSHIP
00000S123   US  ITALY
00000BH01   UK  
00000VA03   US  
00000SR01   UK  US

В идеале, только два студента имеют гражданство США, но их должно быть 3 в качестве студентатакже имеет двойное гражданство для США.Пожалуйста, обратите внимание, что я не хочу жестко кодировать в где пункт

WHERE  DUAL_CITIZENSHIP='US'

Спасибо, Синдху

Ответы [ 4 ]

0 голосов
/ 15 октября 2018
WITH cte (Citizenship, NumberOfStudents) as (
    SELECT Citizenship, COUNT(*)
    FROM Students
    GROUP BY Citizenship
    UNION ALL
    SELECT DualCitizenship, COUNT(*)
    FROM Students WHERE DualCitizenship IS NOT NULL
    GROUP BY DualCitizenship
)
SELECT Citizenship, SUM(NumberOfStudents) as NumberOfStudents
FROM cte
GROUP BY Citizenship;

Результат:

enter image description here

0 голосов
/ 15 октября 2018

Вы можете использовать объединение для слияния ГРАЖДАНСТВО

    select  ID,  CITIZENSHIP
    from my_table 
    where  CITIZENSHIP ='US'
    union  
    select  ID,  DUAL_CITIZENSHIP
    from my_table 
    where  CITIZENSHIP ='US'


select count(*) 
from (

    select  ID,  CITIZENSHIP
    from my_table 
    where  CITIZENSHIP ='US'
    union  
    select  ID,  DUAL_CITIZENSHIP
    from my_table 
    where  CITIZENSHIP ='US'

)
0 голосов
/ 15 октября 2018

Вы можете использовать UNPIVOT

Select T.Country, count(*)
from (
Select id,Country
from TABLENAME t
     unpivot (
     Country for c in (CITIZENSHIP ,DUALCITIZENSHIP)
     ) Unpvt
     ) T
WHERE len(Country)>0
Group by T.Country

Если вы хотите фильтровать по определенной стране, вы можете туда, где закрыть

0 голосов
/ 15 октября 2018

Фактически, я полагаю, что вы хотите, чтобы 1 ряд стал условно 2 для целей подсчета, а корабль с двойным гражданством будет опущен на второй ряд.Конечно, вы можете запросить гражданство = 'US' или dual_citizenship = 'US', но хотите избежать двойного включения предиката.

Что-то вроде (имена таблиц не были предоставлены):

SELECT count(*)
FROM
(
    SELECT id, citizenship
    FROM yourTable
    UNION ALL
    SELECT id, dual_citizenship as citizenship
    FROM yourTable
    WHERE dual_citizenship is not null
) a
WHERE citizenship = 'US'

Если вы хотите, чтобы все страны:

SELECT citizenship, count(*)
FROM
(
    SELECT id, citizenship
    FROM yourTable
    UNION ALL
    SELECT id, dual_citizenship as citizenship
    FROM yourTable
    WHERE dual_citizenship is not null
) a
GROUP BY citizenship
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...