Группировать по выпускам по филиалам - PullRequest
0 голосов
/ 05 марта 2012

У меня есть 3 таблицы agencytbl, branchtbl и tourtbl. Я пытаюсь получить общее количество филиалов, связанных с агентством, и общее количество туров, связанных с филиалами. это мой запрос:

SELECT  dbo.AgencyTbl.AgencyName AS [LIST OF EACH AGENCY],
(select COUNT(*) from BranchTbl where BranchTbl.AgencyID = AgencyTbl.AgencyID) as [NO OF BRANCHES],
(SELECT COUNT(*) AS Expr1 FROM dbo.TourTbl 
WHERE      (dbo.BranchTbl.BranchID = BranchID)) AS [NO TOURS EVER]

FROM dbo.AgencyTbl INNER JOIN dbo.BranchTbl ON dbo.AgencyTbl.AgencyID = dbo.BranchTbl.AgencyID 
GROUP BY AgencyTbl.AgencyName, AgencyTbl.AgencyID, dbo.BranchTbl.BranchID
order by AgencyTbl.AgencyName

но если я запускаю это, я получаю то же агентство, повторяемое из-за группы по branchid следующим образом:

 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  2
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
 this estate agent  12  0
    next agency     47  2
   next agency      47  4
   next agency      47  1
   next agency      47  1

Как я могу просто указать одно агентство и общее количество филиалов, принадлежащих этому агентству, а затем общее количество туров, принадлежащих этому филиалу и не повторяющих названия агентств.

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Я предполагаю, что под "общим числом туров, принадлежащих этому филиалу", вы подразумеваете "общее количество туров, принадлежащих всем филиалам, принадлежащим этому агентству "?

Если это так, вы можете использовать любой из этих подходов.

Подход 1: Используйте только подзапросы, не присоединяйтесь к BranchTbl:

SELECT  dbo.AgencyTbl.AgencyName AS [LIST OF EACH AGENCY],
        ( SELECT COUNT(*)
            FROM BranchTbl
           WHERE AgencyID = AgencyTbl.AgencyID
        ) AS [NO OF BRANCHES],
        ( SELECT COUNT(*)
            FROM dbo.TourTbl
           WHERE BranchID IN
                  ( SELECT BranchID
                      FROM dbo.BranchTbl
                     WHERE AgencyID = AgencyTbl.AgencyID
                  )
        ) AS [NO TOURS EVER]
  FROM dbo.AgencyTbl
 GROUP
    BY AgencyTbl.AgencyName,
       AgencyTbl.AgencyID
 ORDER
    BY AgencyTbl.AgencyName
;

Подход 2: Используйте только объединения, не используйте подзапросы:

SELECT dbo.AgencyTbl.AgencyName AS [LIST OF EACH AGENCY],
       COUNT(DISTINCT dbo.BranchTbl.BranchID) AS [NO OF BRANCHES],
       COUNT(dbo.TourTbl.BranchTbl) AS [NO TOURS EVER]
  FROM dbo.AgencyTbl
  LEFT
  JOIN dbo.BranchTbl
    ON dbo.BranchTbl.AgencyID = dbo.AgencyTbl.AgencyID
  LEFT
  JOIN dbo.TourTbl
    ON dbo.TourTbl.BranchID = dbo.BranchTbl.BranchID
 GROUP
    BY AgencyTbl.AgencyName
 ORDER
    BY AgencyTbl.AgencyName
;

Есть несколько других подходов & mdash; например, вы можете присоединиться к BranchTbl, но использовать SUM(SELECT COUNT(*) FROM ...) для получения количества туров & mdash; но я думаю, что вышеупомянутое самое ясное.

[Отказ от ответственности: я не проверял ни один из вышеуказанных запросов.]

1 голос
/ 05 марта 2012

Прежде всего, вам не нужны некоторые ваши подзапросы, так как вы уже делаете JOIN. Кроме того, вы группируете по большему количеству столбцов, которые вам нужны. Попробуйте вместо этого:

SELECT  dbo.AgencyTbl.AgencyName AS [LIST OF EACH AGENCY],
        COUNT(*) AS [NO OF BRANCHES],
        COUNT(dbo.TourTbl.*) AS [NO TOURS EVER],
        COUNT(CASE WHEN YEAR(DT_Started) = YEAR(GETDATE()) THEN dbo.TourTbl.BranchID ELSE NULL END)  [NO OF TOURS YTD (Year To Date)]
FROM dbo.AgencyTbl 
INNER JOIN dbo.BranchTbl 
ON dbo.AgencyTbl.AgencyID = dbo.BranchTbl.AgencyID 
LEFT JOIN dbo.TourTbl 
ON dbo.BranchTbl.BranchID = dbo.TourTbl.BranchID
GROUP BY AgencyTbl.AgencyName
ORDER BY AgencyTbl.AgencyName
...