- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
产品表:
shrimp
lobster
beef
special1
special2
我还有一个交易表,其中每一行都包含上表中的一个产品。我想统计一下交易表,这样我就可以知道有多少虾、龙虾和牛肉被卖出去。然而,具有special1的交易行应计为1x虾和1x龙虾,而special2应计为1x虾、1x龙虾和1x牛肉。
可以帮助我完成此任务的最佳 SQL 语句是什么,或者如何创建规则表来帮助我实现正确的计数?
一些示例:
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` varchar(255) DEFAULT NULL,
`descr` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into product (product_id, descr) values ('1','shrimp dish');
insert into product (product_id, descr) values ('2','beef dish');
insert into product (product_id, descr) values ('3','lobster dish');
insert into product (product_id, descr) values ('4','special1 dish');
CREATE TABLE `ticket` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` varchar(255) DEFAULT NULL,
`price` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
insert into ticket (product_id, price) values ('2',4);
insert into ticket (product_id, price) values ('3',6);
insert into ticket (product_id, price) values ('4',11);
在这里,我想要查询票证,以获取总销售额(21 美元),并且我出售了 2x 虾,2x 龙虾(因为special1 需要 1x 虾和 1x 龙虾来制作)
最佳答案
好吧,在列中进行操作要容易得多,请参阅 my SQLfiddle here :
SELECT iname ingredient, SUM(amount) amount_used
FROM tickets
INNER JOIN products ON pid=tpid
INNER JOIN prodingred ON pi =pid
INNER JOIN ingredients ON iid=ii
GROUP BY iname
但是,您应该再引入两个表 ingredients
和 prodingred
来定义每道菜使用哪种成分的量。与在 SELECT
语句中定义复杂的 CASE
结构相比,拥有适当的表将使整个事情更容易扩展。
我还在分配表prodingred
中引入了amount
列,您可以在其中放置实际数量(以克或千克为单位)每种销售产品的每种成分。这将使您的结果比仅仅说“产品 A 需要 1 只虾”更加准确。
更新
如果您还想查看每张票据对您使用的原料的成本贡献,那么您可以在 prodingred
中添加一列costshare
> 表是一个很好的起点。如果您将此列设置为 float (或双)列,您实际上可以表示每餐(产品)中每种成分的成本份额,如下所示:
| pi | ii | amount | costshare |
|----|----|--------|-----------|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 3 | 3 | 1 | 1 |
| 4 | 1 | 1 | 0.3 |
| 4 | 2 | 1 | 0.7 |
| 5 | 1 | 1 | 0.2 |
| 5 | 2 | 1 | 0.5 |
| 5 | 3 | 1 | 0.3 |
求和就非常简单了:
SELECT iname ingredient, SUM(amount) amount_used,
SUM(ROUND(tprice*costshare*100)/100.) tprice_contribution
FROM tickets
INNER JOIN products ON pid=tpid
INNER JOIN prodingred ON pi =pid
INNER JOIN ingredients ON iid=ii
GROUP BY iname
哪个会让你(见我的 updated SQLfiddle )
| iname | amount_used | tprice_contribution |
|---------|-------------|---------------------|
| beef | 1 | 6 |
| lobster | 2 | 11.7 |
| shrimp | 1 | 3.3 |
关于mysql - 如何多次计算一行以防万一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32577911/
如何选择别名作为“date1”列值?我想选择显示月份和年份格式(如“Jan-18”)的别名。 MySQL 5.0 版。我尝试过,但没有成功: SUM(CASE WHEN MONTH(date1) =
我有一个包含生日和性别的表 SELECT `tblresultdatetime`, `tblresultbirthdate`, `tblgendertexten` FROM `ci_wizard_re
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
当 GHCi 在运行时发现调用产生的值与函数的模式匹配不匹配时,有没有办法让 GHCi 产生更好的异常消息? 它目前给出了产生非详尽模式匹配的函数的行号,虽然有时会有所帮助,但确实需要一轮调试,有时我
再次问好 Stackoverflow! 在过去的几天里,我一直在思考一种以小时为间隔保存每周计划的正确方法。 这是时间表: Monday: 00:00 - 08:00: Sleeping 08:00
我们在混合环境中开发 - 有些人在 Mac 上工作,有些人在 Linux 上工作。这有时被证明是一个挑战,因为那些在 Linux 上工作的人习惯于让他们的文件系统区分大小写,所以提交(意外或其他)多个
指标/圈复杂度:notification_path 的圈复杂度太高。 [9/8]而且我不明白如何解决这个问题。你能帮帮我吗?谢谢 def notification_path return h.co
我正在尝试创建一个方法来检查当前线程是什么,如果它与所需线程不同,则在正确的线程中重新执行(调用者)方法。 我正在使用: -(void)aMethod:(id)aParam { [self ex
我是一名优秀的程序员,十分优秀!