你好家伙我有3个表。 下面是创建数据:聚合与汇总和空记录
CREATE TABLE `positionstyp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`bau_nr_komplett` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `positionstyp_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `positionstyp` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `projektposition` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projekt_id` int(11) NOT NULL,
`preis_vertragskosten` float DEFAULT NULL,
`positionstyp_id` int(11),
PRIMARY KEY (`id`),
KEY `positionstyp_id` (`positionstyp_id`),
CONSTRAINT `fk_projektposition_positionstypID` FOREIGN KEY (`positionstyp_id`) REFERENCES `positionstyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `menge` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`baufortschritt` int(11) NOT NULL DEFAULT 0,
`menge` float NOT NULL,
`projektposition_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `projektposition_id` (`projektposition_id`),
CONSTRAINT `menge_ibfk_10` FOREIGN KEY (`projektposition_id`) REFERENCES `projektposition` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT INTO `positionstyp` (`id`, `parent_id`, `bau_nr_komplett`) VALUES
(1, NULL, '1'),
(2, NULL, '2'),
(3, NULL, '3'),
(4, NULL, '4'),
(5, NULL, '5'),
(6, NULL, '6'),
(7, 3, '325'),
(8, 7, '325.0'),
(9, 7, '325.1'),
(10, 8, '325.0.0');
INSERT INTO `projektposition` (`id`, `projekt_id`, `preis_vertragskosten`, `positionstyp_id`) VALUES
(1, 1325, 100, 3),
(2, 1325, 300, 7),
(3, 1325, 150, 7),
(4, 1325, 200, 10),
(5, 1325, 50, 9);
INSERT INTO `menge` (`id`, `menge`, `baufortschritt`, `projektposition_id`) VALUES
(1, 10, 1, 1),
(2, 20, 20, 2),
(3, 30, 30, 3),
(4, 40, 40, 4),
(5, 50, 100, 5),
(6, 60, 87, 1),
(7, 70, 90, 2),
(8, 80, 10, 3),
(9, 90, 50, 4),
(10, 100, 0, 5),
(11, 1000, 100, 5),
(12, 100, 10, 6);
A “猛恶” 被绑定到一个 “projektposition” 和 “projektposition” 被绑定到一个 “positionstyp”。那么“positionstyp”可能有一个父级“positionstyp”。
在“menge”中有一个“menge”字段和一个称为“menge”的字段“baufortschritt”。然后字段“preis_vertragskosten”给这个组合一个价格。
所以价格的猛恶是(menge
。menge
* menge
。baufortschritt
* projektposition
。preis_vertragskosten
)
在我的选择我想总结的价格,也是 “positionstyp” -entries所有 “positionstyp” -entries在它下面没有“menge”/“projektposition”,所以没有价格,只能用于特定的“projekt_id”
我的第一次尝试是按分组汇总的,但是没有价格的所有“positionstyp”都失败了。
现在我有这个代码,来到附近我想要的东西:
SELECT
pt.id,
pt.parent_id,
SUM(IF(m.menge IS NULL,0, m.menge * p.preis_vertragskosten * m.baufortschritt/100 * (p.projekt_id=1325))) as summe,
pt.bau_nr_komplett
FROM positionstyp pt
LEFT JOIN projektposition p ON (p.positionstyp_id=pt.id)
LEFT JOIN menge m ON (m.projektposition_id=p.id)
GROUP BY pt.id
输出正确的,当然,但总结了门奇不总结了递归positionstyp_parents。 positionstyp-table的递归性更容易在bau_nr_komplett
字段中找到:positionstyp是所有positionstyp的孩子,那bau_nr_komplett是孩子positionstyp的开始s
bau_nr_komplett`(不一定是直接的孩子)。
是否有一些想法?
感谢和问候, 托比亚斯
结果现在是:
bau_nr_komplett summe
1 0
2 0
3 5230
4 0
5 0
6 0
325 22650
325.0 0
325.1 52500
325.0.0 12200
期望的结果是:
bau_nr_komplett summe
1 0
2 0
3 5230+22650+52500+12200
4 0
5 0
6 0
325 22650+52500+12200
325.0 12200
325.1 52500
325.0.0 12200
- 编辑2: 我发现了一个坏的解决方案。坏意味着它与测试数据集一起工作。但与真正的数据库和数据集的100.000s它需要一个半小时; d
SELECT pt.bau_nr_komplett, (
SELECT
SUM(IF(m1.menge IS NULL,0,m1.menge*p1.preis_vertragskosten*m1.baufortschritt/100*(p1.projekt_id=1325)))
FROM positionstyp pt1
LEFT JOIN projektposition p1 ON (p1.positionstyp_id = pt1.id)
LEFT JOIN menge m1 ON (m1.projektposition_id = p1.id)
WHERE pt1.bau_nr_komplett LIKE CONCAT(pt.bau_nr_komplett, "%")
) as summe
FROM positionstyp pt
LEFT JOIN projektposition p ON (p.positionstyp_id = pt.id)
LEFT JOIN menge m ON (m.projektposition_id = p.id)
GROUP BY pt.id
期望的结果是什么? – Strawberry
而positionstyp_id是如何“DEFAULT NULL”!?!?!?!? – Strawberry
以上所需的结果,在html中,对不起。 DEFAULT NULL是一个复制错误 – dobberph