SQL将三张表发票合并为一个查询

时间:2020-01-09 13:11:35

标签: mysql sql relationship

你好

我有3张桌子:

CREATE TABLE `invoice` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice` (`id`) VALUES
(1), 
(2), 
(3);

CREATE TABLE `invoice_deduction` (
  `id` int(11) NOT NULL,
  `invoiceId` int(11) NOT NULL,
  `deductionId` int(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (`invoiceId`) REFERENCES `invoice` (`id`),
  FOREIGN KEY (`deductionId`) REFERENCES `invoice` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice_deduction` (`id`, `invoiceId`, `deductionId`) VALUES
(1, 2, 1),
(2, 3, 1),
(3, 3, 2);

CREATE TABLE `invoice_item` (
  `id` int(11) NOT NULL,
  `invoiceId` int(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (`invoiceId`) REFERENCES `invoice` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice_item` (`id`, `invoiceId`) VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 2),
(5, 2),
(6, 3),
(7, 3),
(8, 3);

例如:

  • 第一张发票包含3个项目(共3个项目)
  • 第二张发票包含第一张发票(扣除额)中的3个项目和2个新项目(总计:5个项目)
  • 第三张发票包含第一张发票(扣除额)中的3个项目,第二张发票(扣除额)中的2个项目和3个新项目(总计:8个项目)

所以我想查询以下结果:

id | count of items (with deductions)
3  | 8
2  | 5
1  | 3

我从以下查询开始:

SELECT 
    i.id, COUNT(*) as countItems
FROM
    invoice i JOIN invoice_item it ON i.id = it.invoiceId
GROUP BY
    it.invoiceId
ORDER BY 
    countItems
DESC

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您需要累计金额:

SELECT i.id, COUNT(*) as countItems,
       SUM(COUNT(*)) OVER (ORDER BY it.id)
FROM invoice i JOIN
     invoice_item it
     ON i.id = it.invoiceId
GROUP BY i.id
ORDER BY countItems;

我不知道您为什么使用LEFT JOIN。我不知道为什么您会有invoiceId值与有效发票不匹配。所以我将其切换为内部联接。