Сумма SQL считается более одного раза - PullRequest
2 голосов
/ 22 ноября 2011

У меня трудности с этим.Этот запрос прекрасно работал при расчете сумм, пока я не поместил первое внутреннее объединение. В таблице tbl_companies есть несколько записей для каждой компании, например, таблица может выглядеть так:

priority      company     externalip
1             bla         9.9.9.9
1             bla         3.3.3.3
1             company2    3.56.6.6

В приведенном ниже запросесумма (которая вычисляется как TotalWithoutNew и TotalAllId удваивается, когда существует более одной записи для компании, и утраивается, если их три, и т. д. Я хочу сделать это просто вернуть приоритет из таблицы tbl_companies

SELECT b.company, 
       b.priority, 
       i.concom, 
       Coalesce (SUM(CASE 
                       WHEN c.category_id = '30' THEN 0 
                       ELSE t.logmins 
                     END), 0)       AS totalwithoutnew, 
       Coalesce (SUM(t.logmins), 0) AS totalallid 
FROM   helpdesk3.dbo.inquiry AS i 
       INNER JOIN [Check].[dbo].[tbl_companies] AS b 
         ON i.concom = b.company COLLATE sql_latin1_general_cp1_ci_as 
       INNER JOIN timelog AS t 
         ON t.inquiry_id = i.inquiry_id 
       INNER JOIN prod AS p 
         ON i.prod_id = p.prod_id 
       INNER JOIN category AS c 
         ON p.category_id = c.category_id 
WHERE  ( Datepart(yyyy, escdate) = 2011 ) 
GROUP  BY i.concom, 
          b.company, 
          b.priority 
ORDER  BY totalwithoutnew DESC, 
          b.priority DESC    

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Вы должны разделить запрос, чтобы избежать нескольких результатов от tbl_companies.

select distinct b.company, 
       b.priority, 
       x.concom, 
       x.totalwithoutnew, 
       x.totalallid 
FROM    (
            SELECT i.concom, 
                   Coalesce (SUM(CASE 
                                   WHEN c.category_id = '30' THEN 0 
                                   ELSE t.logmins 
                                 END), 0)       AS totalwithoutnew, 
                   Coalesce (SUM(t.logmins), 0) AS totalallid 
            FROM   helpdesk3.dbo.inquiry AS i 
                   INNER JOIN timelog AS t 
                     ON t.inquiry_id = i.inquiry_id 
                   INNER JOIN prod AS p 
                     ON i.prod_id = p.prod_id 
                   INNER JOIN category AS c 
                     ON p.category_id = c.category_id 
            WHERE  ( Datepart(yyyy, escdate) = 2011 ) 
            GROUP  BY i.concom 
            ) x
INNER JOIN [Check].[dbo].[tbl_companies] AS b 
          ON x.concom = b.company COLLATE sql_latin1_general_cp1_ci_as 

ORDER  BY x.totalwithoutnew DESC, 
          b.priority DESC  
0 голосов
/ 22 ноября 2011

Есть несколько способов сделать это.Предполагая, что приоритет, компания и externalip однозначно идентифицируют записи tbl_companies, я предлагаю:

SELECT b.company, 
       b.priority, 
       i.concom, 
       Coalesce (SUM(CASE 
                       WHEN c.category_id = '30' THEN 0 
                       ELSE t.logmins 
                     END), 0) / COUNT(DISTINCT b.externalip)  AS totalwithoutnew, 
       Coalesce (SUM(t.logmins), 0) / COUNT(DISTINCT b.externalip) AS totalallid 
FROM   helpdesk3.dbo.inquiry AS i 
       INNER JOIN [Check].[dbo].[tbl_companies] AS b 
         ON i.concom = b.company COLLATE sql_latin1_general_cp1_ci_as 
       INNER JOIN timelog AS t 
         ON t.inquiry_id = i.inquiry_id 
       INNER JOIN prod AS p 
         ON i.prod_id = p.prod_id 
       INNER JOIN category AS c 
         ON p.category_id = c.category_id 
WHERE  ( Datepart(yyyy, escdate) = 2011 ) 
GROUP  BY i.concom, 
          b.company, 
          b.priority 
ORDER  BY totalwithoutnew DESC, 
          b.priority DESC   
0 голосов
/ 22 ноября 2011

При соединении из таблицы INQUIRY с таблицей tbl_companies будет сформирован набор из трех строк (при наличии трех компаний), поэтому следующее объединение с таблицей TIMELOG также будет иметь три значениядля каждого столбца TIMELOG.LOGMINS - следовательно, из этого следует, что вычисление COALESCE (SUM(CASE WHEN C.CATEGORY_ID = '30' THEN 0 ELSE t.LOGMINS END), 0) AS TotalWithoutNew будет утроено.

select 
...
FROM helpdesk3.dbo.INQUIRY AS i 
inner join [Check].[dbo].[tbl_companies] As B ON i.CONCOM = B.company COLLATE SQL_Latin1_General_CP1_CI_AS 
INNER JOIN TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID 
...

Если вы хотите, чтобы в выборке фигурировала одна компания, а не умножалась, удалите объединениеtbl_companies из предложения where и group by.Что-то в этом роде должно работать (хотя, не зная точной структуры данных, я не могу быть уверен):

select 
(select company from [tbl_companies] where company = i.concom) as company,
(select priority from [tbl_companies] where company = i.concom) as priority,
...
FROM helpdesk3.dbo.INQUIRY AS i 
INNER JOIN TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...