Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
特殊记录的Sql查询_Sql_Tsql - Fatal编程技术网

特殊记录的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;正确的结果是|日期