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
我如何总结这两笔钱?
我永远不会与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.
bookingproductionperformance是返回一个已知的值.根本没有理由这样做.看起来好像您想要为每个性能获取总量,在这种情况下,您的查询可以简化为以下内容:
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并将这些产品的总和相加以得出总价值.
作为一些建议,我总是建议您在接受查询正确之前了解您希望从查询返回的值.最好的可以而且确实会犯错误.能够捕获它们因为您可以看到返回的值不正确将有所帮助.