繁体   English   中英

从其他表格中选择两个日期

[英]Select between two dates from other table

我有一个mysql表(file_payments)来保存文件中包含的付款记录,看起来像这样

ID  FILE   START_DATE   END_DATE    NO_PAYMTS
--  -----  ----------   ----------  ---------
1   file1  2013-10-11   2013-10-15     6
2   file2  2013-10-16   2013-10-20     10

然后我有另一个表格(付款),其中包含有关此付款的更多详细信息

   ID   DATE        AMOUNT       BANK   
   ---  ----------  ----------   ----  
    1   2013-10-11  100.00        3
    2   2013-10-12  500.00        3
    3   2013-10-13  400.00        2
    4   2013-10-15  200.00        2 
    5   2013-10-16  400.00        4  
    6   2013-10-18  300.00        1 
    7   2013-10-19  700.00        3 

我需要关联两个表以验证第一个表中的NO_PAYMTS对应于第二个表中的实际付款数量,因此,我正在考虑对第二个表中从第一个表开始的START_DATEEND_DATE之间的记录进行计数。 在此示例中,预期的输出为:

START_DATE   END_DATE    NO_PAYMTS   ACTUAL_PAYMTS
----------   ----------  ---------   -------------
2013-10-11   2013-10-15     6             4
2013-10-16   2013-10-20     10            3

我很困惑如何执行查询,但可能会是这样的:

从file_payments中选择SELECT ID,FILE,START_DATE,END_DATE,NO_PAYMTS()

显然,这是行不通的,因为WHERE子句中没有任何标准可以联接表,我该如何使其起作用?

查询:

SQLFIDDLEExample

SELECT t1.ID,
       t1.FILE,
       t1.START_DATE,
       t1.END_DATE,
       t1.NO_PAYMTS,
       (SELECT COUNT(*)
        FROM Table2 t2
        WHERE t2.DATE >= t1.START_DATE
        AND t2.DATE <= t1.END_DATE ) AS ACTUAL_PAYMTS
FROM Table1 t1

结果:

| ID |  FILE | START_DATE |   END_DATE | NO_PAYMTS | ACTUAL_PAYMTS |
|----|-------|------------|------------|-----------|---------------|
|  1 | file1 | 2013-10-11 | 2013-10-15 |         6 |             4 |
|  2 | file2 | 2013-10-16 | 2013-10-20 |        10 |             3 |

查询:

SELECT f.id, f.file, f.start_date, f.end_date, f.no_paymnts, COUNT(p.bank) 
from file_payments f, payments p
WHERE p.date BETWEEN f.start_date AND f.end_date
GROUP BY f.id;

JSFiddle: http ://sqlfiddle.com/#!2/8446f/13

试试这个...它对我有用:)我可以自由地只计算表2中的ID,因为从理论上讲,它比使用*更快。

SELECT T1.ID,
       T1.FILE,
       T1.START_DATE,
       T1.END_DATE,
       T1.NO_PAYMTS,
       (SELECT COUNT(T2.ID) FROM TABLE2 T2 WHERE T2.DATE>=T1.START_DATE AND T2.DATE<=T1.END_DATE) as ACTUAL_PAYMTS
FROM TABLE1 T1;

最好的方法是使用SQL函数。 创建如下所示的函数,然后通过查询执行它。

功能说明

DELIMITER $$
DROP FUNCTION IF EXISTS `getPaymentCount`$$

CREATE  FUNCTION `getPaymentCount`(startDate DATE,endDate DATE) RETURNS INT(10)
BEGIN
    DECLARE paymentCount INT(10);
    SELECT  COUNT(*) INTO paymentCount FROM payments WHERE  DATE  BETWEEN startDate AND endDate;
    RETURN paymentCount;
END$$

DELIMITER ;

查询:

SELECT ID,FILE,START_DATE,END_DATE,NO_PAYMTS,getPaymentCount(start_date,end_date) AS ACTUAL_NO_OF_PAYMENTS FROM file_payments;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM