特殊记录的Sql查询
首先,请原谅我英语不好 我有两张桌子:特殊记录的Sql查询,sql,tsql,Sql,Tsql,首先,请原谅我英语不好 我有两张桌子: 主表: | product id | pr_name | remain_Qty | +--------------+------------------+-------------------+ | 1 | x | 13 | | 2 | y | 18 | |
| product id | pr_name | remain_Qty |
+--------------+------------------+-------------------+
| 1 | x | 13 |
| 2 | y | 18 |
| 3 | z | 21 |
+--------------+------------------+-------------------+
+--------------+------------------+----------+--------+
|日期|请购单id |数量|价格|
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 3 | 1000 |
| 2010-01-02 | 1 | 5 | 1200 |
| 2010-01-01 | 2 | 11 | 1100 |
| 2010-01-03 | 1 | 4 | 1400 |
| 2010-01-04 | 3 | 3 | 1300 |
| 2010-01-01 | 2 | 6 | 1600 |
| 2010-01-03 | 1 | 7 | 1700 |
| 2010-01-02 | 3 | 3 | 1300 |
| 2010-01-01 | 3 | 5 | 1500 |
| 2010-01-04 | 3 | 7 | 1700 |
| 2010-01-06 | 2 | 8 | 1800 |
| 2010-01-07 | 2 | 4 | 1400 |
| 2010-01-03 | 1 | 3 | 1300 |
| 2010-01-04 | 3 | 6 | 1600 |
| 2010-01-08 | 1 | 1 | 1100 |
+--------------+------------------+----------+--------+
产品总数量1=23
产品总数量2=29
产品总数量3=21
因此,我需要明细表的列表,其中列表按请购单id、日期和价格排序,但每个请购单id的总和(数量)不超过主表产品id的剩余数量
例如:
+--------------+------------------+----------+--------+
| date | pr_id | Qty |price |
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 3 | 1000 |
| 2010-01-02 | 1 | 5 | 1200 |
| 2010-01-03 | 1 | 4 | 1400 |
| 2010-01-03 | 1 | 1 | 1700 |
| 2010-01-01 | 2 | 11 | 1100 |
| 2010-01-01 | 2 | 6 | 1600 |
| 2010-01-01 | 3 | 5 | 1500 |
| 2010-01-02 | 3 | 3 | 1300 |
| 2010-01-04 | 3 | 3 | 1300 |
| 2010-01-04 | 3 | 7 | 1700 |
+--------------+------------------+----------+--------+
按信息分类的日产品
在建议的声明下面
select t2.date,t2.pr_id,t1.pr_name,sum(qty) as qty_buy,sum(price) as amount from master_table as t1
inner join detail_table as t2 on t1.product_id=t2.pr_id
group by t2.date,t2.pr_id
order by t1.date,t2.pr_id
按信息分类的日产品
在建议的声明下面
select t2.date,t2.pr_id,t1.pr_name,sum(qty) as qty_buy,sum(price) as amount from master_table as t1
inner join detail_table as t2 on t1.product_id=t2.pr_id
group by t2.date,t2.pr_id
order by t1.date,t2.pr_id
我很难理解你到底想要什么 所以,如果我理解得很好,您需要一些与产品相对应的数据,但不要查看您的剩余项 因此,我还不能绕过前面的第一个查询,而只从中获取剩余的查询 因此,我现在的查询只需停止,直到找到允许的剩余项 为了能够做您想要做的事情,您需要首先创建一个视图,该视图根据您的数量生成行 差不多
> +--------------+------------------+----------+--------+
| date | pr_id | Qty |price |
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 3 | 1000 |
变成
> +--------------+------------------+----------+--------+
| date | pr_id | Qty |price |
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 1 | 1000
| 2010-01-01 | 1 | 1 | 1000 |
| 2010-01-01 | 1 | 1 | 1000 |
然后计算行数,直到剩下的项目允许您这样做
按价格、请购单id和日期重新组合所有行后
瞧,我很难理解你真正想要什么 所以,如果我理解得很好,您需要一些与产品相对应的数据,但不要查看您的剩余项 因此,我还不能绕过前面的第一个查询,而只从中获取剩余的查询 因此,我现在的查询只需停止,直到找到允许的剩余项 为了能够做您想要做的事情,您需要首先创建一个视图,该视图根据您的数量生成行 差不多
> +--------------+------------------+----------+--------+
| date | pr_id | Qty |price |
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 3 | 1000 |
变成
> +--------------+------------------+----------+--------+
| date | pr_id | Qty |price |
+--------------+------------------+----------+--------+
| 2010-01-01 | 1 | 1 | 1000
| 2010-01-01 | 1 | 1 | 1000 |
| 2010-01-01 | 1 | 1 | 1000 |
然后计算行数,直到剩下的项目允许您这样做
按价格、请购单id和日期重新组合所有行后
瞧,与其说是直接的回答,不如说是澄清。但看起来他们可能想要的是基于库存被耗尽,以满足已知可用数量的订单,但即使如此,这也不够,因为在2010-01-03年,产品1可能缺少第二个数量3。。。如果从他的样本数据中只看ID=1,就会发现
| date | pr_id | Qty |price | Qty Available to fill order
+--------------+--------+-----+-------+
| 2010-01-01 | 1 | 3 | 1000 | 13 - 3 = 10 avail next order
| 2010-01-02 | 1 | 5 | 1200 | 10 - 5 = 5 avail next order
| 2010-01-03 | 1 | 3 | 1300 | 5 - 3 = 2 avail next order
| 2010-01-03 | 1 | 4 | 1400 | only 2 to PARTIALLY fill this order
| 2010-01-03 | 1 | 7 | 1700 | none available
| 2010-01-08 | 1 | 1 | 1100 | none available
如果删除额外的样本记录,将导致
| date | pr_id | Qty |price | Qty Available to fill order
+--------------+--------+-----+-------+
| 2010-01-01 | 1 | 3 | 1000 | 13 - 3 = 10 avail next order
| 2010-01-02 | 1 | 5 | 1200 | 10 - 5 = 5 avail next order
| 2010-01-03 | 1 | 4 | 1400 | 5 - 4 = 1 avail for next order
| 2010-01-03 | 1 | 7 | 1700 | only 1 of the 7 available
| 2010-01-08 | 1 | 1 | 1100 | no more available...
那么Aliasghar,这是否更能代表你想要做的事情???根据首先输入系统的订单填写可用订单,根据库存填写尽可能多的订单,然后停在那里
请对此答案添加评论以确认,也许我们可以帮助解决。。。另外,请确认您正在使用哪个数据库。。。SQL Server、Oracle、MySQL等。与其说是直接的SQL回答,不如说是澄清。但看起来他们可能想要的是基于库存被耗尽,以满足已知可用数量的订单,但即使如此,这也不够,因为在2010-01-03年,产品1可能缺少第二个数量3。。。如果从他的样本数据中只看ID=1,就会发现
| date | pr_id | Qty |price | Qty Available to fill order
+--------------+--------+-----+-------+
| 2010-01-01 | 1 | 3 | 1000 | 13 - 3 = 10 avail next order
| 2010-01-02 | 1 | 5 | 1200 | 10 - 5 = 5 avail next order
| 2010-01-03 | 1 | 3 | 1300 | 5 - 3 = 2 avail next order
| 2010-01-03 | 1 | 4 | 1400 | only 2 to PARTIALLY fill this order
| 2010-01-03 | 1 | 7 | 1700 | none available
| 2010-01-08 | 1 | 1 | 1100 | none available
如果删除额外的样本记录,将导致
| date | pr_id | Qty |price | Qty Available to fill order
+--------------+--------+-----+-------+
| 2010-01-01 | 1 | 3 | 1000 | 13 - 3 = 10 avail next order
| 2010-01-02 | 1 | 5 | 1200 | 10 - 5 = 5 avail next order
| 2010-01-03 | 1 | 4 | 1400 | 5 - 4 = 1 avail for next order
| 2010-01-03 | 1 | 7 | 1700 | only 1 of the 7 available
| 2010-01-08 | 1 | 1 | 1100 | no more available...
那么Aliasghar,这是否更能代表你想要做的事情???根据首先输入系统的订单填写可用订单,根据库存填写尽可能多的订单,然后停在那里
请对此答案添加评论以确认,也许我们可以帮助解决。。。另外,请确认您正在使用哪个数据库。。。SQL Server、Oracle、MySQL等。这里是一个pr_id=1的工作查询,我使用了MySQL:
select final.pr_date, final.pr_id, count(t_qty) as qty, final.price from
(select * FROM (select q.pr_date, q.pr_id, 1 as t_qty, q.price , @t := @t + t_qty total
FROM(
SELECT d.pr_date, d.pr_id, 1 as t_qty, d.price
FROM detail_table d
JOIN generator_4k i
ON i.n between 1 and d.qty
WHERE d.pr_id= 1
Order by d.id, d.pr_date) q
CROSS JOIN (SELECT @t := 0) i) c
WHERE c.total <= (select remain_qty from master_table WHERE product_id = 1)) final
group by final.pr_date , final.pr_id , final.price ;
这里是pr_id=1的工作查询,我使用了MySql:
select final.pr_date, final.pr_id, count(t_qty) as qty, final.price from
(select * FROM (select q.pr_date, q.pr_id, 1 as t_qty, q.price , @t := @t + t_qty total
FROM(
SELECT d.pr_date, d.pr_id, 1 as t_qty, d.price
FROM detail_table d
JOIN generator_4k i
ON i.n between 1 and d.qty
WHERE d.pr_id= 1
Order by d.id, d.pr_date) q
CROSS JOIN (SELECT @t := 0) i) c
WHERE c.total <= (select remain_qty from master_table WHERE product_id = 1)) final
group by final.pr_date , final.pr_id , final.price ;
这里的问题本身并不清楚,因为英语很差:)你的输出毫无意义,你能解释一下你是如何得出这样的结果的吗?我同意@theweeknd。对于产品1,您应该有6个结果,但您只显示了4个。另外,请包括您的rdbmsI,以了解他在说什么。OP希望查询返回尽可能多的行,只要它们的总价等于剩余数量值。产品id为1的剩余数量为13,因此他返回值3,4,5,1,因为它们总计为13。问题本身不清楚,因为英文不好:)您的输出没有意义,请您解释一下您是如何得出这样的结果的。我同意@theweeknd。对于产品1,您应该有6个结果,但您只显示了4个。另外,请包括您的rdbmsI,以了解他在说什么。OP希望查询返回尽可能多的行,只要它们的总价等于剩余数量值。产品id为1的剩余数量为13,因此他返回值3,4,5,1,因为它们总计为13.5;正确的结果是|日期