过去几天我一直被这个MySQL查询所困扰,在我把PC扔出窗外之前寻求专家帮助,哈哈。
我有一张包含发票的表格;发票编号列名称为Trans_ref $$(主键)。
每个发票都链接到一个作业,列名是OPSREF $$ _ ORIGINAL(外键)。
两列都在同一张表中。
一份工作可以有多张发票。
现在的问题是我试图创建一个查询,该查询将在作业组中按顺序识别FIRST发票(Trans_ref $$),如果该FIRST发票具有日期范围,则输出该作业(OPSREF $$ _原件)。 发票编号是顺序编号和唯一编号。
我尝试使用case / min group by语句来识别数据范围内作业组中的第一张发票,但是此查询并未隔离日期范围内的第一张发票,而只是输出第1张或第2张或者工作组中与日期范围匹配的第三个定位发票....我希望这是有道理的。
我已经包含了桌子的屏幕截图和所需的输出,如果有人,我会很感激 你好 在过去的一天里,我被这个问题困扰了,在我把电脑扔出窗外之前寻求专家的帮助,哈哈。
我有一张包含发票的表格;发票编号列名称为Trans_ref $$(主键)。
每个发票都链接到一个作业,列名是OPSREF $$ _ ORIGINAL(外键)。
两列都在同一张表中。
一份工作可以有多张发票。
现在的问题是我试图创建一个查询来识别作业组中的FIRST发票(Trans_ref $$),如果该FIRST发票带有日期范围,则输出作业(OPSREF $$) _原版的)。 发票编号为顺序/唯一编号。
我尝试使用case / min group by语句来识别数据范围内作业组中的第一张发票,但是此查询并未隔离日期范围内的第一张发票,而只是输出第1张或第2张或者工作组中与日期范围匹配的第三个定位发票....我希望这是有道理的。
这里是我使用的代码
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,看它是否在日期范围内(2014年8月27日 - 2014年9月2日)
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
------------------------
基于此,你能建议我怎么做吗?感谢
这是表定义;
tablename - INVOICE_HEADER_UNS
**TRANS_REF$$** char(7) - Primary key
INVOICE_DATE_D8 datatime
OPSREF$$_ORIGINAL char(11)
16/09/2014 - 以下是使用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
答案 0 :(得分:0)
我认为这可以帮助你,你可以根据需要进行调整。
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