如何计算百分比并生成以下结果

时间:2018-01-22 13:27:50

标签: mysql

我有一个表架构

CREATE TABLE `charge` (
  `charge_id` int(11) NOT NULL AUTO_INCREMENT,
  `selling_date` date DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `charge_type_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`charge_id`)
);
CREATE TABLE `charge_type` (
  `charge_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `charge_type` varchar(20) NOT NULL,
  `is_deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`charge_type_id`)
);
CREATE TABLE `charge_type_tax_list` (
  `tax_type_id` int(11) NOT NULL,
  `charge_type_id` int(11) NOT NULL,
  PRIMARY KEY (`tax_type_id`,`charge_type_id`)
);
CREATE TABLE `tax_type` (
  `tax_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `tax_type` varchar(35) NOT NULL,
  `percentage` decimal(5,4) NOT NULL DEFAULT '0.0000',
  `is_deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`tax_type_id`)
);
INSERT INTO charge (
  `selling_date`,
  `amount`,
  `is_deleted`,
  `charge_type_id`
)
VALUES
("2013-12-01", 50, 0, 1), 
("2013-12-01", 20, 0, 2), 
("2013-12-02", 40, 0, 1), 
("2013-12-02", 30, 0, 3), 
("2013-12-02", 30, 1, 1), 
("2013-12-03", 10, 0, 1);
INSERT INTO charge_type (
  `charge_type_id`,
  `charge_type`,
  `is_deleted`
)
VALUES
(1, "room charge", 0), 
(2, "snack charge", 0), 
(3, "deleted charge", 1);
INSERT INTO charge_type_tax_list (
  `tax_type_id`,
  `charge_type_id`
)
VALUES
(1, 1),
(2, 1),
(3, 1),
(1, 2),
(1, 3);
INSERT INTO tax_type (
  `tax_type_id`,
  `tax_type` ,
  `percentage`,
  `is_deleted`

)
VALUES
(1, "GST", 0.05, 0),
(2, "HRT", 0.04, 0),
(3, "DELETED TAX", 0.10, 1);

我希望您生成一个列出所有费用和税收总计的查询 使用给定的架构,您的查询应该生成:

Selling Date    Charge Type Amount  Tax
2013-12-01      Room Charge  50.00  4.50
2013-12-01      Snack Charge 20.00  1.00
2013-12-02      Room Charge  40.00  3.60
2013-12-03      Room Charge  10.00  0.90

不显示已删除的费用(is_deleted已标记)  不显示具有已删除的charge_types的费用(is_deleted已标记)  不要考虑被删除的tax_type(is_deleted),但仍应显示包含的charge_type)

请帮助我,我迫切需要它。谢谢

2 个答案:

答案 0 :(得分:0)

请阅读MySQL Join Made Easy以了解如何使用联接。这是一个查询,它应该通过连接公共属性上的表来提供您想要的结果。

SELECT A.`selling_date` AS `Selling Date`, B.`charge_type` AS `Charge Type`
, A.`amount` AS `Amount`, (A.`amount` *  D.`percentage`) AS `Tax` FROM 
`charge` A LEFT JOIN  
`charge_type` B ON A.`charge_type_id`=B.`charge_type_id` INNER JOIN 
`charge_type_tax_list` C ON B.`charge_type_id`=C.`charge_type_id` 
INNER JOIN `tax_type` D ON C.`tax_type_id`=D.`tax_type_id`
WHERE 
A.`is_deleted`=0 AND B.`is_deleted`=0 AND
D.`is_deleted`=0;

这是 SQL FIDDLE DEMO

答案 1 :(得分:0)

下面的这个查询会得到你想要的结果

select charge.selling_date as SellingDate, 
charge.amount as Amount,
charge_type.charge_type as ChargeType,
sum(charge.amount * tax_type.percentage) as Tax
From charge
inner join charge_type on charge.charge_type_id=charge_type.charge_type_id,
tax_type
where charge.is_deleted=0 and charge_type.is_deleted=0 and tax_type.is_deleted=0
group by charge.selling_date, charge.amount,charge_type.charge_type