按一列的值连接两个表并计算

时间:2015-06-10 19:02:43

标签: sql sql-server join sql-server-2014

感谢您对此感兴趣。 我在一张桌子上有这样的东西

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之间的搜索比率,找到具有该id的用户并返回用户名

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

在这部分之后它给了我

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

这只计算状态。 这个:

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

只计算你。这部分就像一个魅力...... 在这里,我尝试加入这两个临时表并计算比率,并以最佳比率返回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的连接操作。所以我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分: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))