繁体   English   中英

mysql查询分组问题

[英]Issue with Group by Mysql query

在过去的几天里,我一直被这个MySQL查询困扰,并在我将PC扔出窗外之前寻求一些专家帮助,哈哈。

我有一张包含发票的表格; 发票编号列名称为Trans_ref $$(主键)。

每个发票都链接到一个作业,列名称为OPSREF $$ _ ORIGINAL(外键)。

两列都在同一表中。

一个工作可以有多个发票。

现在的问题是我正在尝试创建一个查询,该查询将按顺序标识作业组中的第一张发票(Trans_ref $$),并且如果该第一张发票的日期范围内,则输出该作业(OPSREF $$ _ ORIGINAL)。 发票编号是连续的,并且是唯一的编号。

我尝试使用case / min group by语句来标识数据范围内作业组中的第一张发票,但是此查询未隔离日期范围内的第一张发票,而是仅输出第一或第二或第三位置符合日期范围的工作组中的发票…。我希望这是有道理的。

我提供了该表的屏幕截图和所需的输出,如果您好,在过去的一天里有人被我打扰了,请问我,在我将PC扔到窗外之前,寻求一些专家帮助,大声笑。

我有一张包含发票的表格; 发票编号列名称为Trans_ref $$(主键)。

每个发票都链接到一个作业,列名称为OPSREF $$ _ ORIGINAL(外键)。

两列都在同一表中。

一个工作可以有多个发票。

现在的问题是我正在尝试创建一个查询,该查询将标识作业组中的第一张发票(Trans_ref $$),并且如果该第一张发票的日期范围内,则输出该作业(OPSREF $$ _ ORIGINAL)。 发票编号(顺序编号/唯一编号)。

我尝试使用case / min group by语句来标识数据范围内作业组中的第一张发票,但是此查询未隔离日期范围内的第一张发票,而是仅输出第一或第二或第三位置符合日期范围的工作组中的发票…。我希望这是有道理的。

这是我使用的代码

SET @START_DATE := "2014-08-27";
SET @END_DATE:= "2014-09-02";

select 
count(TRANS_REF$$),
Case 
when min(TRANS_REF$$) and INVOICE_DATE_D8>=@START_DATE and INVOICE_DATE_D8<=@END_DATE
then OPSREF$$_ORIGINAL
end as OPSREF$$_ORIGINAL
from INVOICE_HEADER_UNS
where 
TRANSACTION_STATUS = 9
and Tmode$$="06"
group by OPSREF$$_ORIGINAL

所以要分阶段分解过程.....

1.抓住INVOICE_HEADER_UNS表中的每个OPSREF $$ _ ORIGINAL组

Date Range - Start 27/08/2014 - End 02/09/2014                  

TABLE - INVOICE_HEADER_UNS                  

TRANS_REF$$ INVOICE_DATE_D8    OPSREF$$_ORIGINAL                
---------------------------------------------
|   1       |    26/08/2014 |  ABC          | 
|   2       |    02/08/2014 |  ABC          |  
---------------------------------------------
|   3       |    28/08/2014 |  DDD          |  
|   4       |    09/09/2014 |  DDD          |  
---------------------------------------------
|   5       |   01/01/2013  |  JJJ          |
|   6       |   21/12/2013  |  JJJ          |
---------------------------------------------
|   7       |   01/09/2014  |  LLL          |
---------------------------------------------

2.在每个OPSREF $$ _ ORIGINAL组中,查看TRANS_REF $$序列,并找到该OPSREF $$ _ ORIGINAL组中的第一个TRANS_REF $$。

Date Range - Start 27/08/2014 - End 02/09/2014                  

TABLE - INVOICE_HEADER_UNS                  

TRANS_REF$$ INVOICE_DATE_D8    OPSREF$$_ORIGINAL           Is First inv?                
--------------------------------------------------------
|   1       |    26/08/2014 |  ABC                      |  yes           
|   2       |    02/08/2014 |  ABC                      |  no           
--------------------------------------------------------
|   3       |    28/08/2014 |  DDD                      |  yes           
|   4       |    09/09/2014 |  DDD                      |  no            
---------------------------------------------------------
|   5       |   01/01/2013  |  JJJ                      |  yes               
|   6       |   21/12/2013  |  JJJ                      |  no            
---------------------------------------------------------
|   7       |   01/09/2014  |  LLL                      |  yes               
---------------------------------------------------------

3.以该组的有序顺序查看FIRST INVOICE,并检查该行的INVOICE_DATE_D8,看它是否在日期范围内(27/08/2014-02/09/2014)

Date Range - Start 27/08/2014 - End 02/09/2014                  

TABLE - INVOICE_HEADER_UNS                  

TRANS_REF$$ INVOICE_DATE_D8    OPSREF$$_ORIGINAL            Is First inv?    In date range?         
--------------------------------------------------------
|   1       |    26/08/2014 |  ABC                      |  yes              no

--------------------------------------------------------
|   3       |    28/08/2014 |  DDD                      |  yes              yes

---------------------------------------------------------
|   5       |   01/01/2013  |  JJJ                      |  yes              no

---------------------------------------------------------
|   7       |   01/09/2014  |  LLL                      |  yes              yes

4.每行是否符合条件(即第一张发票和日期-是+是)? 如果正确,则为该行输出不同的OPSREF $$ _ ORIGINAL

这是上面示例的期望输出

Date Range - Start 27/08/2014 - End 02/09/2014                  

TABLE - INVOICE_HEADER_UNS                  

OPSREF$$_ORIGINAL         Is First inv?    In date range?           
------------------------
|  DDD                  |  yes                yes
------------------------
|  LLL                  |  yes                yes
------------------------

基于此,您能建议我该怎么做吗? 谢谢

这是表的定义;

表名-INVOICE_HEADER_UNS

**TRANS_REF$$**    char(7) - Primary key

INVOICE_DATE_D8    datatime                 

OPSREF$$_ORIGINAL    char(11) 

2014年9月16日-这似乎是使用DRapp语法返回正确结果的查询,但是该查询需要以某种方式进行优化,因为当我将其附加到较大的查询作为子查询时,它会导致我的MYSQL工作台崩溃。 对查询进行解释后,它似乎正在对28,309行进行索引。 如何在不影响结果的情况下优化此查询?

我尝试将以下内容添加到where子句中,但是它会将更多记录添加到整个查询输出中,但是索引979行/

set @START_DATE := '2014-08-27';
set @END_DATE := '2014-09-02';

SELECT

if (min(ihu.INVOICE_DATE_D8)>= @START_DATE and min(ihu.INVOICE_DATE_D8)<= @END_DATE     ihu.opsref$$_original, null) as firstinvoiceindaterange

from
INVOICE_HEADER_UNS ihu

join CONSIGNMENT_ALL_HEADER_UNS on ihu.OUR_REF = CONSIGNMENT_ALL_HEADER_UNS.OPSREF$$

where ihu.TRANSACTION_STATUS = 9 and ihu.Tmode$$="06"

AND CONSIGNMENT_ALL_HEADER_UNS.CONS_TYPE$$ <>'7'

AND CONSIGNMENT_ALL_HEADER_UNS.CONS_TYPE$$ in ('3' , '5', '9')

#and ihu.INVOICE_DATE_D8>= @START_DATE and ihu.INVOICE_DATE_D8<= @END_DATE

group by

ihu.opsref$$_original

我认为这应该对您有所帮助,您可以根据需要进行调整。

SELECT
      ihu.opsref$$_original,
      MIN( ihu.TRANS_REF$$ ) MinRefForEntireJob,
      MIN( ihu.INVOICE_DATE_D8 ) MinDateForEntireJob,
      MIN( IF(    ihu.INVOICE_DATE_D8 >= @START_DATE
              AND ihu.INVOICE_DATE_D8 <= @END_DATE, ihu.TRANS_REF$$, null )) as MinRefWithinDateRange,
      MIN( IF(    ihu.INVOICE_DATE_D8 >= @START_DATE
              AND ihu.INVOICE_DATE_D8 <= @END_DATE, ihu.INVOICE_DATE_D8, null )) as MinDateWithinDateRange
   from
      INVOICE_HEADER_UNS ihu,
      ( select @START_DATE := '2014-08-27',
               @END_DATE := '2014-09-02' ) sqlvars
   group by
      ihu.opsref$$_original

看到这些结果后,您应该只可以添加HAVING子句,例如

   HAVING
      MinDateWithinDateRange IS NOT NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM