2012-03-05 41 views
0

我有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

我假设“属于该分支的旅行总数”是指“属于该代理的所有分支的旅行总数”属于“?

如果是这样,您可以使用其中任何一种方法。

方法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 
; 

有是其他一些方法—例如,您可以加入BranchTbl,但使用SUM(SELECT COUNT(*) FROM ...)获得参观次数—,但我认为以上是最清楚的。

[免责声明:我没有测试过上述任何查询]

+0

+1感谢这么多的第一种方法,我认为解决我的问题 – Zaki 2012-03-05 13:21:50

+0

@样本1:不客气! – ruakh 2012-03-05 13:38:03

1

首先,你不需要你的一些子查询的,因为你已经做了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 
+0

谢谢你,如果我添加另一列来计算旅游日期我会怎么做?我曾经这样做过:(SELECT COUNT(*)AS Expr1 FROM dbo.TourTbl WHERE(dbo.BranchTbl.BranchID = BranchID) AND(YEAR(DT_Started)= YEAR({fn NOW()})))AS [没有旅行YTD(今年迄今)] – Zaki 2012-03-05 13:17:51

+0

@ Sam1 - 好的,添加了列 – Lamak 2012-03-05 13:21:27

+0

+1卢哈答案做了伎俩感谢 – Zaki 2012-03-05 13:22:22