2015-06-10 3 views
0

Благодарим вас за интерес. я в одной таблице некоторые вещи, как этотобъединение двух таблиц по значению одного столбца и вычисление

sifrez | sifKorisnikPK | Status 
    1 | 1   | 'P' 
    2 | 1   | 'P' 
    3 | 1   | 'U' 
    4 | 2   | 'P' 
    5 | 2   | 'P' 
    6 | 2   | 'U' 
    7 | 2   | 'U' 
    8 | 3   | 'U' 
    9 | 3   | 'U' 
    10 | 3   | 'U' 
    11 | 3   | 'U' 
    12 | 4   | 'P' 
    13 | 4   | 'P' 

Затем я создал хранимую функцию, которая сосчитать значения P и коэффициента поиска U между ними найти пользователя с этим идентификатором и вернуть имя пользователя

CREATE PROCEDURE sp_getBestUsernames 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 

    SELECT SifKorisnikPK, COUNT (Status) AS BrojLosih 
    INTO #LosaRez 
    FROM Rezervacija 
    WHERE Status = 'P' 
    GROUP BY SifKorisnikPK 
    order by count(*) desc 

После этого part it give me

sifKorisnikPK | BrojLosih 
     1  | 2 
     2  | 2 
     4  | 2 

Это только число p для статуса. И это:

SELECT SifKorisnikPK, COUNT (Status) AS BrojDobrih 
INTO #DobraRez 
FROM Rezervacija 
WHERE Status = 'U' 
GROUP BY SifKorisnikPK 
order by count(*) desc 

я получить

sifKorisnikPK | BrojDobrih 
    1  | 1 
    2  | 2 
    3  | 4 

только подсчитывать U. Эта часть работы как шарм ... И вот я пытаюсь соединить эти две временные таблицы и вычислить отношение и вернуться SifKorisnik с лучшим соотношением

SELECT Username FROM Korisnik 
    WHERE SifKorisnik = (SELECT TOP 1 a.SifKorisnikPK 
         FROM #DobraRez a 
         INNER JOIN #LosaRez b 
         ON a.SifKorisnikPK = b.SifKorisnikPK OR 
         a.SifKorisnikPK != b.SifKorisnikPK  
         WHERE a.BrojDobrih - b.BrojLosih > 0 
         ORDER BY a.BrojDobrih - b.BrojLosih) 
    END 

И после присоединения к операции я ожидаю, чтобы получить некоторые вещи, как это, что я не получаю

sifKorisnikPK | BrojDobrih | BrojLosih 1 | 1 | 2 2 | 2 | 2 3 | 4 | 0 4 | 0 | 2

поэтому я могу рассчитать коэффициент BrojDobrih - BrojLosih и вернуть SifKorisnikPK, который является наилучшим соотношением. В этом случае это был бы SifKorisnik 3. Но моя процедура получила SifKorisnik 2, что является вторым лучшим. Я предполагаю, что проблема заключается в объединении операции, что она не вводит 0. Так как я могу это решить?

+0

@NepaliRookie SQL Server 2014 – DarkTemplar

ответ

1

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

SELECT 
    A.sifKorisnikPK, 
    IsNull(BrojDobrih,0) BrojDobrih, 
    IsNull(BrojLosih,0) BrojLosih 
FROM (select distinct sifKorisnikPK from Rezervacija) A 
LEFT JOIN #LosaRez B 
    ON A.sifKorisnikPK = B.sifKorisnikPK 
LEFT JOIN #DobraRez C 
    ON A.sifKorisnikPK = C.sifKorisnikPK 
ORDER BY (IsNull(BrojDobrih,0) - IsNull(BrojLosih,0)) 
+0

Легче тогда. Пожалуйста, проверьте, разрешает ли запрос вашу проблему. Я считаю, что так и есть. – Nizam

+1

Yap. Большое спасибо! – DarkTemplar

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