使用更有效的方法替换子选择计数

时间:2014-01-23 10:12:04

标签: mysql sql select group-by sum

我今天似乎有一点温泉时刻,似乎无法想出一种更好的方法来在桌子上进行子选择计数。

基本上我需要做的是每个不同的供应商然后我需要2个计数(来自同一个表),一个用于分配给该供应商的总记录,另一个用于该供应商的有争议记录。目前我有下面的查询,这在技术上是正确的,但在1工厂+记录的桌子上很慢。我确信有更好的方法可以做到这一点,但我今晚不能为我的生活做好准备。

SELECT 
DISTINCT tblsuppliers.SupplierName, 
(SELECT COUNT(*) FROM tblmovements a WHERE m.Supplier=a.Supplier AND a.TicketStatus IN(0,1) AND a.DateRequired>='2013-09-01 00:00:00' AND a.DateRequired<='2013-11-30 23:59:59') as 'Total Tickets',
(SELECT COUNT(*) FROM tblmovements b WHERE m.Supplier=b.Supplier AND b.TicketStatus IN(0,1) AND b.DateRequired>='2013-09-01 00:00:00' AND b.DateRequired<='2013-11-30 23:59:59' AND (b.SuppIsDisputed=1 OR b.SuppDisputeClearedBy>0)) as 'Total Disputed'
FROM tblmovements m 
INNER JOIN tblsuppliers ON m.Supplier=tblsuppliers.ID 
ORDER BY tblsuppliers.SupplierName ASC

联合表只是为了给我一个供应商名称,而不是存储在移动表中的供应商ID。非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

SELECT 
tblsuppliers.SupplierName, 
SUM(IF(TicketStatus IN(0,1) AND DateRequired>='2013-09-01 00:00:00' AND DateRequired<='2013-11-30 23:59:59', 1, 0)) as 'Total Tickets',
SUM(IF(TicketStatus IN(0,1) AND DateRequired>='2013-09-01 00:00:00' AND DateRequired<='2013-11-30 23:59:59' AND (SuppIsDisputed=1 OR SuppDisputeClearedBy>0), 1, 0)) as 'Total Disputed'
FROM tblmovements m 
INNER JOIN tblsuppliers ON m.Supplier=tblsuppliers.ID 
GROUP BY tblsuppliers.SupplierName

答案 1 :(得分:1)

试试这个:

SELECT s.SupplierName, 
       SUM(CASE WHEN m.TicketStatus IN(0,1) AND m.DateRequired>='2013-09-01 00:00:00' AND 
                     m.DateRequired<='2013-11-30 23:59:59' THEN 1 ELSE 0 
           END)  AS 'Total Tickets', 
       SUM(CASE WHEN m.TicketStatus IN(0,1) AND m.DateRequired>='2013-09-01 00:00:00' AND 
                     m.DateRequired<='2013-11-30 23:59:59' AND 
                    (m.SuppIsDisputed=1 OR m.SuppDisputeClearedBy>0) THEN 1 ELSE 0 
           END) AS 'Total Disputed'
FROM tblmovements m 
INNER JOIN tblsuppliers s ON m.Supplier=s.ID 
GROUP BY s.ID 
ORDER BY s.SupplierName ASC