多个 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!
我正在尝试从一个 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!