2015-01-28 5 views
-6

У меня есть две таблицы:Список городов, где более половины студентов приняли

tbl1: schoolID schoolname

tbl2 StudentID, schoolID, Stu_Name, адрес, город, штат, статус

Поле состояния содержит значение A для принятия или R для отклоненных

Мне нужно указать города в штате Нью-Йорк, где было принято более половины заявок студентов.

+7

Пожалуйста, попробуйте сами. Если у вас возникнут какие-либо проблемы, задайте вопрос с конкретной проблемой. –

+2

Stackoverflow не является домашней работой. –

+0

Это не домашнее задание! Я работаю над заявлением студента-заявителя! Спасибо. Я задаю вопрос, потому что я не знаком с таким типом написания запросов. – user3267270

ответ

1

ОБРАЗЕЦ ТАБЛИЦЫ

SELECT * INTO #tbl1 FROM 
(
    SELECT 1 schoolID,'SchoolA' schoolname 
    UNION ALL 
    SELECT 1,'SchoolB' 
)TAB 


SELECT * INTO #tbl2 FROM 
(
    SELECT 1 StudentID,1 schoolID ,'A' Stu_Name,'XXX' address,'CITYA' [CITY],'NY' [STATE],'A' [STATUS] 
    UNION ALL 
    SELECT 2,1,'A','XXX','CITYA','NY','A' 
    UNION ALL 
    SELECT 3,1,'A','XXX','CITYA','NY','A' 
    UNION ALL 
    SELECT 4,1,'A','XXX','CITYA','NY','A' 
    UNION ALL 
    SELECT 14,1,'A','XXX','CITYA','NY','R' 
    UNION ALL 
    SELECT 5,1,'A','XXX','CITYA','NY','R' 
    UNION ALL 
    SELECT 6,1,'A','XXX','CITYA','NY','R' 
    UNION ALL 
    SELECT 7,1,'A','XXX','CITYB','NY','A' 
    UNION ALL 
    SELECT 8,1,'A','XXX','CITYB','NY','A' 
    UNION ALL 
    SELECT 9,1,'A','XXX','CITYC','NY','A' 
    UNION ALL 
    SELECT 10,1,'A','XXX','CITYC','NY','R' 
)TAB 

QUERY

Если вам нужно выяснить, города, где более половины студентов-приложений были приняты независимо от школы, вы можете следовать ниже запрос.

DECLARE @CITY VARCHAR(30)='NY' 

SELECT [CITY] 
FROM 
(
    SELECT DISTINCT [CITY] 
    ,CASE WHEN 
    (
     -- Gets half of total count 
     COUNT([STATUS]) OVER(PARTITION BY [CITY])/2) 
     >= 
     -- Checks if half of total count is greater than count of accepted for each cities 
     COUNT(CASE WHEN [STATUS]='A' THEN 1 END) OVER(PARTITION BY [CITY] 
    ) 
    THEN 'N' 
    ELSE 'Y' 
    END ACCEPTED 
    FROM #tbl2 
    WHERE [CITY] = @CITY 
)TAB 
WHERE ACCEPTED='Y' 

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

DECLARE @SCHOOLID INT = 1 
DECLARE @CITY VARCHAR(30)='NY' 

SELECT [CITY] 
FROM 
(
    SELECT DISTINCT [CITY] 
    ,CASE WHEN 
    (
     COUNT([STATUS]) OVER(PARTITION BY [CITY])/2) 
     >= 
     COUNT(CASE WHEN [STATUS]='A' THEN 1 END) OVER(PARTITION BY [CITY] 
    ) 
    THEN 'N' 
    ELSE 'Y' 
    END ACCEPTED 
    FROM #tbl1 T1 
    JOIN #tbl2 T2 ON T1.schoolID=T2.schoolID AND [email protected] 
    WHERE [CITY] = @CITY 
)TAB 
WHERE ACCEPTED='Y' 
+0

Спасибо, Сарат, как вы фильтруете по штату 'NY'? – user3267270

+0

Также я вижу, что вы говорите случай, когда условие тогда N, не должно быть условием случая True, тогда Y else N? Благодарю. – user3267270

+0

Это выглядит довольно хорошо для меня. Единственное, что я бы изменил, это использовать сумму с выражением case вместо count (случай, когда status = 'a' ... он делает то же самое, но я думаю, что более ясно иметь сумму (случай, когда status = a 'then 1 else 0 end) –

Смежные вопросы