SQL总和

Dav*_*usa 3 sql oracle sum count

我已经计算了不同表中的计数总和.这样做两次,每次一次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
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

TOTALAMOUNT
-----------
         70
         60 

我如何总结这两笔钱?

Ben*_*Ben 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
Run Code Online (Sandbox Code Playgroud)

断开查询的原因是返回两行的唯一原因是解析函数和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
                )
Run Code Online (Sandbox Code Playgroud)

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

作为对此的解释,现在我终于设法让你的架构正确!我们选择了两个表演,1并且2.然后,我们选择与这些表演相关的每个作品以及与这些作品相关的每个预订.您可以根据表中的categoryprice内容进一步简化此操作.然后我们获取每个预订的数量,categoryprice并将这些产品的总和相加以得出总价值.

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

进一步阅读: