2013-05-05 70 views
1

我有這樣的MySQL表和它的數據:從這3個MySQL SELECT查詢中做出單個查詢的提示?

CREATE TABLE IF NOT EXISTS `invoices` (
    `invoice_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `invoice_owner` int(11) NOT NULL, 
    `customer_id` int(11) NOT NULL, 
    `invoice_no` int(11) NOT NULL, 
    `invoice_date` date NOT NULL, 
    `invoice_due_date` date NOT NULL, 
    `invoice_status` enum('open','cancelled','overdue','closed','archived') NOT NULL, 
    `tax1_desc` varchar(50) NOT NULL, 
    `tax1_rate` float(6,3) NOT NULL, 
    `tax2_desc` varchar(50) NOT NULL, 
    `tax2_rate` float(6,3) NOT NULL, 
    `invoice_total` float(11,2) NOT NULL DEFAULT '0.00', 
    `invoice_notes` text, 
    PRIMARY KEY (`invoice_id`), 
    KEY `customer_invoice` (`customer_id`,`invoice_no`), 
    KEY `invoice_owner` (`invoice_owner`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1005 ; 



INSERT INTO `invoices` (`invoice_id`, `invoice_owner`, `customer_id`, `invoice_no`, `invoice_date`, `invoice_due_date`, `invoice_status`, `tax1_desc`, `tax1_rate`, `tax2_desc`, `tax2_rate`, `invoice_total`, `invoice_notes`) VALUES 
(999, 1, 0, 999, '2012-12-13', '2013-01-13', 'archived', '', 0.000, '', 0.000, 255.48, NULL), 
(1000, 1, 0, 1000, '2013-04-14', '2013-05-14', 'cancelled', '', 0.000, '', 0.000, 105.28, NULL), 
(1001, 1, 0, 1001, '2013-04-13', '2013-05-13', 'closed', '', 0.000, '', 0.000, 202.33, NULL), 
(1002, 1, 0, 1002, '2013-04-15', '2013-05-14', 'open', '', 0.000, '', 0.000, 1113.85, NULL), 
(1003, 1, 0, 1003, '2013-03-25', '2013-04-25', 'overdue', '', 0.000, '', 0.000, 114.75, NULL), 
(1004, 0, 0, 1004, '2013-02-28', '2013-03-28', 'overdue', '', 0.000, '', 0.000, 2890.56, NULL); 

我必須做出選擇,這將使我3和:

  1. 總過期發票

    SELECT SUM(invoice_total) AS逾期發票invoice_status ='逾期'

  2. 總計逾期1-30天

    SELECT SUM(invoice_total)AS逾期FROM發票其中invoice_status = '逾期' AND BETWEEN invoice_due_date invoice_due_date + 1個invoice_due_date + 30

  3. 得到總逾期超過30天

    SELECT SUM(invoice_total) AS逾期FROM發票其中invoice_status = '逾期' AND invoice_due_date> = invoice_due_date + 31

當然,總逾期=逾期1-30天+逾期超過30天

問題:如何在一個SQL查詢中執行所有操作?

我要回到3個數字:總逾期,逾期1-30,逾期超過30

+0

__提問_好方法_ – Ejaz 2013-05-05 00:08:38

回答

1

使用一些MySQLisms讓它短一點,這樣的事情應該這樣做;只需在同一行上使用3個獨立的總和;

SELECT 
    SUM(invoice_total) AS overdue1, 
    SUM(invoice_total * 
    (NOW() BETWEEN invoice_due_date + INTERVAL 1 DAY 
    AND invoice_due_date + INTERVAL 30 DAY)) AS overdue2, 
    SUM(invoice_total * 
    (NOW() > invoice_due_date + INTERVAL 30 DAY)) AS overdue3 
FROM invoices 
WHERE invoice_status = 'overdue' 

An SQLfiddle to test with

+0

非常感謝!我認爲這將會完成這項工作。並感謝SQLfiddle。我不知道存在。 – 2013-05-05 00:23:43