2017-01-10 2 views
-1

Я создал два запроса, которые возвращают результаты, которые я хочу получить по отдельности, но мне нужен единственный набор результатов из одного запроса, и я не могу понять, как объединить эти два. Я планирую использовать вывод запроса в качестве входных данных для инструкции insert для создания новой записи в другой таблице.SQL SUM и Count в одном запросе

Независимо от того, что я пробовал, это приводит к умножению TotalExpense на количество лотов.

Я использую SQL Server 2008 R2.

Любые предложения/решения, которые получили высокую оценку.

SELECT 
    sPortfolioName 
    ,Count(lot.lLotID) as TotalLots 

FROM [Owners] 

inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
inner Join Lot on Lot.lOwnersID = Owners.lOwnersID 

where bManaged = 'Y' 
AND tblExpense.lExpenseCodeID = '5' 
Group By sPortfolioName 
Order By sPortfolioName 


SELECT 
     Portfolio.sPortfolioName 
     ,sum (tblExpense.mRate) as TotalExpense 
    FROM [Owners] 
    inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
    inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
    where bManaged = 'Y' 
    AND tblExpense.lExpenseCodeID = '5' 
    Group By sPortfolioName 

Текущие результаты

sPortfolioName TotalLots 
Black   836 
Blue   1107 
Brown   22 

sPortfolioName TotalExpense 
Black   393.90 
Blue   17.83 
Brown   511.00 

Желаемая Result

sPortfolioName TotalLots TotalExpense 
Black   836   393.90 
Blue   1107  17.83 
Brown   22   511.00 

ответ

1

Оба запроса почти то же самое с той же самой колонке, используемой в GROUP BY пункте, так что вы можете объединить их в одном запросе, имеющие как агрегатные функции COUNT() и SUM()

SELECT 
    sPortfolioName 
    ,Count(lot.lLotID) as TotalLots 
    ,sum (tblExpense.mRate) as TotalExpense 
FROM [Owners] 

inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
inner Join Lot on Lot.lOwnersID = Owners.lOwnersID 

where bManaged = 'Y' 
AND tblExpense.lExpenseCodeID = '5' 
Group By sPortfolioName 
Order By sPortfolioName 

EDIT

Try это и проверить, не возвращает ли его желаемый желаемый результат

SELECT t1.sPortfolioName, t1.TotalLots, t2.TotalExpense 
FROM 
(
SELECT 
    sPortfolioName 
    ,Count(lot.lLotID) as TotalLots 

FROM [Owners] 

inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
inner Join Lot on Lot.lOwnersID = Owners.lOwnersID 

where bManaged = 'Y' 
AND tblExpense.lExpenseCodeID = '5' 
Group By sPortfolioName 
) As t1 

INNER JOIN 

(
    SELECT 
     Portfolio.sPortfolioName 
     ,sum (tblExpense.mRate) as TotalExpense 
    FROM [Owners] 
    inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
    inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
    where bManaged = 'Y' 
    AND tblExpense.lExpenseCodeID = '5' 
    Group By sPortfolioName 
) As t2 

ON t1.sPortfolioName = t2.sPortfolioName 
ORDER BY t1.sPortfolioName 
+0

Это не помогло, умножив TotalExpense на количество лотов. У каждого владельца есть один расход и много лотов. Мне нужен промежуточный итог для каждого портфолио. –

+0

check edit section ответ выше, я использовал соединение между двумя подзапросами, каждый подзапрос возвращает результат и объединяется, используя соединение, основанное на столбце общего столбца 'sPortfolioName' –

+0

Это взломало его :) Я никогда не думаю для присоединения к select. Спасибо кучи, которые вы спасли мне, чтобы придумать какую-то хромую вставку, а затем обновить заявление. –

0

Проверьте Это.

 SELECT 
      Portfolio.sPortfolioName 
      ,Count(lot.lLotID) as TotalLots 
      ,sum (tblExpense.mRate) as TotalExpense 

     FROM [Owners] 

     inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
     inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
     inner Join Lot on Lot.lOwnersID = Owners.lOwnersID 

     where bManaged = 'Y' 
     AND tblExpense.lExpenseCodeID = '5' 
     Group By sPortfolioName ,sPortfolioName 
     Order By sPortfolioName 
+0

Как я и предполагал, это умножило TotalExpense на количество лотов. –

1

Несмотря на то, что уже есть принятый ответ, я просто хочу отметить, что запрос можно упростить. например:

SELECT 
    sPortfolioName 
    ,Lot.TotalLots 
    ,sum (tblExpense.mRate) as TotalExpense 
FROM [Owners] 
inner join Portfolio on Portfolio.lUserID = Owners.lUserID 
inner Join tblExpense on tblExpense.lOwnersID = Owners.lOwnersID 
inner Join (select lOwnersID, count(*) as TotalLots from Lot group by lOwnersID) Lot on Lot.lOwnersID = Owners.lOwnersID 
where bManaged = 'Y' 
AND tblExpense.lExpenseCodeID = '5' 
Group By sPortfolioName 
Order By sPortfolioName 
Смежные вопросы