多个 select 存储过程

multiple select on stored procedure

我正在尝试从一个 table 中执行多个 select,但它只显示了最后一个 select 语句。

CREATE PROCEDURE `usp_GetStockCard` (IN Matecode varchar(10))
BEGIN
    (select tran_date  as tran_date
        from TM_matbalance
        where Mate_code=Matecode);

    (select Mate_code as Mate_code
        from TM_matbalance
        where Mate_code=Matecode);    

    (select tran_qtyx as Qty_in 
        from TM_matbalance
        where tran_type='IN'
        and mate_code=matecode);

    (select tran_qtyx as Qty_out 
        from TM_matbalance
        where  tran_type='OUT'
        and mate_code=matecode);    
    END

我试图在每个 select 语句后将分号更改为逗号,但它说语法错误:缺少 'semicolon'。 请帮忙

您需要将查询结构化为一个,或者将参数传递给存储过程 select 您想要 output/query,要重组您的查询,您需要类似以下内容:

`CREATE PROCEDURE `usp_GetStockCard` (IN Matecode varchar(10))
BEGIN
(select tran_date  as tran_date, Mate_code as Mate_code, tran_qtyx as Qty
    from TM_matbalance
    where Mate_code=Matecode
    and (tran_type='IN' or tran_type='OUT');
END`

或者,如果您有 ID 列,请试试这个:

SELECT coalesce(ta.id, tb.id) as tran_id, coalesce(ta.tran_date, tb.tran_date)  as tran_date, coalesce(ta.Mate_code, tb.Mate_code)  as Mate_code, ta.tran_type as Qty_In, tb.tran_type as Qty_Out
from (select ta.*
  from TM_matbalance ta
  where ta.tran_type = 'IN'
and Mate_code=Matecode
 ) ta full outer join
 (select tb.*
  from TM_matbalance tb
  where tb.tran_type = 'OUT'
and Mate_code=Matecode
 ) tb
 on ta.id = tb.id ;

如果您不需要 return ID 列,只需将 "id" 替换为您的 ID 列的名称,然后删除 coalesce(ta.id, tb.id) as tran_id

我看了你的问题,我想我解决了。

基本上这里有两个问题,第一个是根据 [=36= 中的值将 Tran_Qtyx 列变为 Qty_In 和 Qty_Out 的 table ] 列(IN 或 OUT)...您使用此查询解决的那部分问题

SELECT Tran_Date, Mate_Code,
       SUM(CASE WHEN Tran_Type = 'IN' THEN Tran_Qtyx ELSE 0 END) Qty_In,
       SUM(CASE WHEN Tran_Type = 'OUT' THEN Tran_Qtyx ELSE 0 END) Qty_Out
FROM myTable
WHERE Mate_Code = 'MAT001'
GROUP BY DATE(Tran_Date)

注意:在您想要的结果中,我只看到“MAT001”为 Mate_Code,因此我在此解决方案中坚持使用它,并将 MAT002 从结果中排除。

更多关于 pivot table 你可以阅读 here,在那里你可以找到一个 link,这很好看,在那里你可以找到很多东西关于 mysql 个查询。

问题的第二部分是获取 Qty_Balance 列。类似问题已解决here。它是如何根据上一行的值计算行值。

因此您的完整查询可能如下所示:

SELECT t1.Tran_Date, t1.Mate_Code, t1.Qty_In, t1.Qty_Out, 
       @b := @b + t1.Qty_In - t1.Qty_Out AS Qty_Balance
FROM
(SELECT @b := 0) AS dummy
CROSS JOIN
(SELECT Tran_Date, Mate_Code,
        SUM(CASE WHEN Tran_Type = 'IN' THEN Tran_Qtyx ELSE 0 END) Qty_In,
        SUM(CASE WHEN Tran_Type = 'OUT' THEN Tran_Qtyx ELSE 0 END) Qty_Out
 FROM myTable
 WHERE Mate_Code = 'MAT001'
 GROUP BY DATE(Tran_Date)) AS t1
 ORDER BY t1.Tran_Date;

注意:可能只认为您应该在此处更改 table 名称,它应该有效。

这是SQL Fiddle所以你可以看看它是如何工作的!

GL!