【问题标题】:MySQL query not acting as expectedMySQL 查询未按预期运行
【发布时间】:2021-06-07 18:46:18
【问题描述】:

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

为此我需要三个表。

表 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

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

【问题讨论】:

  • 始终 GROUP BY SELECT 中的所有非聚合列
  • @Strawberry 谢谢你的评论。但是,我不确定您的确切意思。
  • SELECT billInvoiceMain.biId, SUM(transaction.paymentAmount), billInvoiceMain.useritemid FROM billInvoiceMain... GROUP BY billInvoiceMain.biId, billInvoiceMain.useritemid;
  • @Strawberry 谢谢你的解释。这就说得通了。但是,我仍然很困惑这对我需要能够选择所有未付发票的最终目标有何帮助。无论我在第三个查询中的 GROUP BY 中有什么,它都会出错。
  • 你能用想要的结果编辑问题吗

标签: mysql


【解决方案1】:

以下查询检索与sum of all the payments from transaction grouped by bill id 的结果与sum of all the bills from billInvoiceDetail grouped by bill id 的结果相结合得到的biId 不匹配的行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多