Как удалить повторяющиеся записи в этом запросе T-SQL, содержащем LEFT OUTER JOIN - PullRequest
2 голосов
/ 28 сентября 2011

У меня проблемы с удалением повторяющихся записей из этого запроса, содержащих несколько ЛЕВЫХ ВНЕШНИХ СОЕДИНЕНИЙ

SELECT s.Category,
       SUM(spons.SPONS) AS SPONSOREDAMT,
       SUM(priv.PRIV)   AS PRIVATEAMT FROM   (SELECT ID   AS ID,
               Name AS Category FROM   dbo.ServicesTable) s
       LEFT OUTER JOIN (SELECT DISTINCT ( ServiceId )   AS ServiceId,
                                        DateCreated,
                                        SUM(SPONSORAMT) AS SPONS
                        FROM   dbo.SponsorMonthlyBill
                        GROUP  BY ServiceId,
                                  DateCreated) spons
         ON ( s.ID = spons.ServiceId )
       LEFT OUTER JOIN (SELECT DISTINCT ( ServiceId )   AS ServiceId,
                                        DateCreated,
                                        SUM(PRIVATEAMT) AS PRIV
                        FROM   dbo.PrivateMonthlyBill
                        GROUP  BY ServiceId,
                                  DateCreated) priv
         ON ( s.ID = priv.ServiceId )
            AND ( MONTH(priv.DateCreated) = MONTH('2011-08-04') )
GROUP  BY s.Category,
          spons.SPONS,
          priv.PRIV 

Если я сделаю так, чтобы последняя строка выглядела так:

GROUP BY s.Category 

вместо того, что егоТеперь я буду добавлять дубликаты записей.Если есть более двух записей, все 3 или 4 или более добавляются.Итак, как это сделать.

Scorpi0 дал ответ, который сработал, но нуждается в некоторой дополнительной модификации.Это было изменение, которое я сделал к нему:

SELECT  s.Name AS Category,
   SUM(spons.SPONS) AS SPONSOREDAMT,
   SUM(priv.PRIV) AS PRIVATEAMT, SUM(spons.SPONS) + SUM(priv.PRIV) as 
   TOTAL,spons.DateCreated

   FROM   dbo.ServicesTable s
   LEFT OUTER JOIN (SELECT ServiceId,DateCreated,
                           SUM(SPONSORAMT) AS SPONS
                    FROM   dbo.SponsorMonthlyBill
                    GROUP  BY ServiceId,DateCreated) spons
     ON ( s.ID = spons.ServiceId )
   LEFT OUTER JOIN (SELECT distinct ServiceId,
                           SUM(PRIVATEAMT) AS PRIV
                    FROM   dbo.PrivateMonthlyBill
                    GROUP  BY ServiceId
                    ) priv
     ON ( s.ID = priv.ServiceId )
GROUP  BY s.Name,spons.DateCreated

Я знаю, что он снова ввел дубликаты, но как удержать DateCreated вне GROUP BY и по-прежнему обращаться к нему в главном предложении SELECT?Пожалуйста, имейте в виду, что это View и есть некоторые правила, которым он должен следовать.

1 Ответ

0 голосов
/ 28 сентября 2011

Ваши дубликаты поступают из вашей бесполезной группы от DateCreated.

Попробуйте выполнить этот запрос, он должен дать вам правильные результаты:

SELECT s.Name AS Category,
       SUM(spons.SPONS) AS SPONSOREDAMT,
       SUM(priv.PRIV)   AS PRIVATEAMT
FROM   dbo.ServicesTable s
       LEFT OUTER JOIN (SELECT ServiceId,
                               SUM(SPONSORAMT) AS SPONS
                        FROM   dbo.SponsorMonthlyBill
                        GROUP  BY ServiceId) spons
         ON ( s.ID = spons.ServiceId )
       LEFT OUTER JOIN (SELECT ServiceId
                               SUM(PRIVATEAMT) AS PRIV
                        FROM   dbo.PrivateMonthlyBill
                        WHERE MONTH(DateCreated) = MONTH('2011-08-04')
                        GROUP  BY ServiceId
                        ) priv
         ON ( s.ID = priv.ServiceId )
GROUP  BY s.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...