MySQL 查询未按预期运行

时间:2021-03-09 20:29:42

标签: mysql

我正在尝试获得所有尚未全额支付的账单。

我需要三个表。

表 1 - billInvoiceMain

biId - unique ID
userId - users ID
type - bill or invoice
userItemId - unique ID that user chooses for their records

表 2 - billInvoiceDetail

biId - references unique ID in billInvoiceMain
quantity
price

表 3 - 交易

transactionId - unique ID
userId - users ID
biId - references id in billInvoiceMain
paymentAmount

所以用户输入账单,然后一旦他们付款(可以对账单进行多次小额付款,直到达到全额,或者他们可以为全额支付一次),他们输入并获得保存在交易表中。

Here is a SQL Fiddle 具有测试数据的缩写版本。

CREATE TABLE IF NOT EXISTS `billInvoiceDetail` (
  `biId` int(15) NOT NULL,
  `productId` int(15) DEFAULT NULL,
  `accountId` int(15) DEFAULT NULL,
  `description` varchar(2000) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `quantity` decimal(20,3) NOT NULL,
  `price` decimal(20,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `billInvoiceDetail` (`biId`, `productId`, `accountId`, `description`, `quantity`, `price`) VALUES
(51, NULL, 7, 'Pylaisiella steerei Ando & Higuchi', 4.000, 19.65),
(51, NULL, 11, 'Rubus insons L.H. Bailey', 1.000, 10.17),
(99, NULL, 11, 'Leontodon hispidus L.', 3.000, 11.99),
(99, NULL, 7, 'Peltophorum (T. Vogel) Benth.', 5.000, 33.76),
(100, NULL, 8, 'Scleria P.J. Bergius', 1.000, 10.55),
(100, NULL, 12, 'Gilia ochroleuca M.E. Jones ssp. exilis (A. Gray) A.D. Grant & V.E. Grant', 2.000, 42.54);

CREATE TABLE IF NOT EXISTS `billInvoiceMain` (
  `biId` int(15) NOT NULL,
  `userId` int(15) NOT NULL,
  `type` varchar(7) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `cvId` int(15) NOT NULL,
  `startDate` date DEFAULT NULL,
  `dueDate` date DEFAULT NULL,
  `userItemId` varchar(25) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `billInvoiceMain` (`biId`, `userId`, `type`, `cvId`, `startDate`, `dueDate`, `userItemId`) VALUES
(51, 1, 'bill', 17, '2021-01-01', '2021-01-31', '53396841'),
(99, 1, 'bill', 28, '2021-01-01', '2021-01-31', '16269083'),
(100, 1, 'bill', 28, '2021-01-07', '2021-01-17', '03200283');

CREATE TABLE IF NOT EXISTS `transaction` (
  `transactionId` int(15) NOT NULL,
  `userId` int(15) NOT NULL,
  `biId` int(15) NOT NULL,
  `paymentDate` date NOT NULL,
  `paymentMethod` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `accountId` int(15) NOT NULL,
  `paymentAmount` decimal(20,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `transaction` (`transactionId`, `userId`, `biId`, `paymentDate`, `paymentMethod`, `accountId`, `paymentAmount`) VALUES
(51, 1, 51, '2021-01-04', 'Check', 1, 78.60),
(52, 1, 51, '2021-01-19', 'Credit Card', 3, 10.17),
(53, 1, 99, '2021-01-14', 'Check', 1, 10.00);
SELECT billInvoiceMain.biId, SUM(transaction.paymentAmount), billInvoiceMain.useritemid
FROM billInvoiceMain
INNER JOIN transaction ON billInvoiceMain.biId = transaction.biId
WHERE billInvoiceMain.userId = 1 AND billInvoiceMain.type = 'bill'
GROUP BY billInvoiceMain.biId;

SELECT ROUND(ABS(SUM(billInvoiceDetail.price *billInvoiceDetail.quantity)),2)
FROM billInvoiceDetail
INNER JOIN billInvoiceMain ON billInvoiceDetail.biId = billInvoiceMain.biId
WHERE billInvoiceMain.userId=1 AND billInvoiceMain.type = 'bill'
GROUP BY billInvoiceMain.biId;

SELECT billInvoiceMain.biId, billInvoiceMain.useritemid
FROM billInvoiceMain
INNER JOIN transaction ON billInvoiceMain.biId = transaction.biId
INNER JOIN billInvoiceDetail ON billInvoiceDetail.biId = transaction.biId
WHERE billInvoiceMain.userId = 1 AND billInvoiceMain.type = 'bill'
HAVING SUM(transaction.paymentAmount) != ROUND(ABS(SUM(billInvoiceDetail.price *billInvoiceDetail.quantity)),2);

第一个查询允许我对按账单 ID 分组的交易的所有付款求和。

第二个查询汇总了所有账单。

第三个查询我尝试将两者结合起来。但是,当我尝试使用 GROUP BY 时,它会出错。所以,我摆脱了它,现在它只会返回第一张账单,即使它已经支付。

Desired Results(根据交易表检索所有未全额支付账单的biId和userItemId):

<头>
biId userItemId
99 16269083
100 03200283

我花了很多时间试图弄清楚这一点,但我迷路了。

1 个答案:

答案 0 :(得分:1)

以下查询检索与通过连接 biId 的结果和 sum of all the payments from transaction grouped by bill id 的结果获得的 sum of all the bills from billInvoiceDetail grouped by bill id 不匹配的行。

SELECT biId, useritemid FROM billInvoiceMain
WHERE userId = 1 AND type = 'bill'
AND biId NOT IN(
  SELECT t.biId FROM
    (SELECT biId,SUM(paymentAmount) pay FROM transaction GROUP BY biId) t
    INNER JOIN
    (SELECT biId,ROUND(ABS(SUM(price*quantity)),2) bill FROM billInvoiceDetail GROUP BY biId) d
    ON t.biId=d.biId AND t.pay=d.bill
)

SQL Fiddle