3

我已经计算了不同表中的计数总和。此操作执行两次,每次执行一次performanceID。现在我想得到这两个总和的总和。

以下是我目前所做的两个总和的代码:

    SELECT SUM((COUNT (BookingID) * CategoryPrice)) AS TotalAmount
    FROM Booking, Production
    WHERE Booking.PerformanceID IN(SELECT PerformanceID FROM Performance WHERE PerformanceID = '1')
    and Production.ProductionID IN 
    (SELECT ProductionID FROM Performance WHERE PerformanceID = '1') 
    GROUP BY BookingID, CategoryPrice
    UNION ALL
    SELECT SUM((COUNT (BookingID) * CategoryPrice)) AS TotalAmount
    FROM Booking, Production
    WHERE Booking.PerformanceID IN(SELECT PerformanceID FROM Performance WHERE PerformanceID = '2')
    and Production.ProductionID IN 
    (SELECT ProductionID FROM Performance WHERE PerformanceID = '2')
     GROUP BY BookingID, CategoryPrice

我得到的结果是:

总金额
------------
         70
         60

我如何在这里总结这两个总和?

4

2 回答 2

7

我永远不会与 FGITW 竞争,但我必须对这个查询说些什么……

如果我们添加空格,我希望你能明白我的意思:

SELECT SUM( (COUNT(BookingID) * CategoryPrice) ) AS TotalAmount
  FROM Booking
     , Production
 WHERE Booking.PerformanceID IN ( SELECT PerformanceID 
                                   FROM Performance 
                                  WHERE PerformanceID = '1')
   AND Production.ProductionID IN ( SELECT ProductionID FROM Performance 
                                     WHERE PerformanceID = '1') 
 GROUP BY BookingID, CategoryPrice
 UNION ALL
SELECT SUM( (COUNT(BookingID) * CategoryPrice)) AS TotalAmount
  FROM Booking
     , Production
 WHERE Booking.PerformanceID IN ( SELECT PerformanceID 
                                    FROM Performance 
                                   WHERE PerformanceID = '2')
   AND Production.ProductionID IN ( SELECT ProductionID 
                                      FROM Performance 
                                     WHERE PerformanceID = '2')
 GROUP BY BookingID, CategoryPrice

将查询分解为返回两行的唯一原因是分析函数和 union all。

  1. 您正在 和 之间进行笛卡尔连接这意味着您将每个中的行数相乘。bookingproduction
  2. 您的子选择performance返回一个已知值。根本没有理由这样做。
  3. 您正在隐式地将数字转换为字符串并再次转换为数字。
  4. 您在这里扫描表或索引 8 次!

似乎您想要每次性能的总金额,在这种情况下,您的查询可以简化为以下内容:

SELECT SUM(bookings * CategoryPrice)
  FROM ( SELECT CategoryPrice , count(*) as bookings
           FROM Booking b
           JOIN performance per
             ON p.performanceid =  per.performanceid
           JOIN Production p
             ON p.productionid = per.productionid
          WHERE p.performanceid in (1, 2)
          GROUP BY CategoryPrice
                )

请注意显式连接语法,它已经存在了几十年,使事情变得更加清晰,并有助于防止错误。假设您在两个表上都有索引,此查询将执行两次范围扫描,一次booking和一次。它还将进行唯一扫描,假设它是该表的主键。productionperformanceidperformanceperformanceid

作为对此的解释,现在我终于设法让您的架构正确!我们选择这两个表演,12。然后,我们选择与这些表演相关的每一部作品以及与这些作品相关的每一部预订。您可以根据表categoryprice中的内容进一步简化此操作。然后,我们获取每个预订的数量categoryprice并将这些乘积相加,从而为您提供总价值。

作为一点建议,我始终建议您在接受查询正确之前了解您希望从查询中返回的值。最好的人可以而且确实会犯错误。能够捕获它们,因为您可以看到返回的值不正确,这将有所帮助。

延伸阅读:

于 2012-05-06T11:12:52.900 回答
0

使用 sub sql,并求和 TotalAmount

SELECT SUM(TotalAmount)
   ( SELECT SUM((COUNT (BookingID) * CategoryPrice)) AS TotalAmount
        FROM Booking, Production
        WHERE Booking.PerformanceID IN(SELECT PerformanceID FROM Performance WHERE PerformanceID = '1')
        and Production.ProductionID IN 
        (SELECT ProductionID FROM Performance WHERE PerformanceID = '1') 
        GROUP BY BookingID, CategoryPrice
        UNION ALL
        SELECT SUM((COUNT (BookingID) * CategoryPrice)) AS TotalAmount
        FROM Booking, Production
        WHERE Booking.PerformanceID IN(SELECT PerformanceID FROM Performance WHERE PerformanceID = '2')
        and Production.ProductionID IN 
        (SELECT ProductionID FROM Performance WHERE PerformanceID = '2')
Group By CategoryPrice)
于 2012-05-06T11:01:01.480 回答