简体   繁体   中英

sql with max and several joins

I am trying to get the last prices each customer paid for each product on mysql. the following sql is not giving me the right data. the max(dateLasFullfillment) doesn't much the row value and its not even the max vsalue. its like the group by works before the max.

select 
    'item' AS type, soitem.productnum as 'SKU',
    (soitem.unitprice / right(uom.code, length(uom.code) - 2)) as unitPrice, 
    replace(customer.name, "#", "") AS priceList, 
    max(soitem.dateLastFulfillment) 
from 
    soitem
left join 
    so ON so.id = soitem.soid
left join
    customer on so.customerid = customer.id
left join 
    product on product.num = soitem.productnum
left join  
    uom on product.uomid = uom.id
where 
    soitem.dateLastFulfillment > now() - interval 6 month 
    and soitem.unitprice > 0 
    and so.statusid in (20, 25, 60)
group by 
    soitem.productnum, customer.name
order by 
    PriceList

Here are some Tables samples with expected results. the sql must start with select statement, no declare etc unless there is no other option.

SO Table:

id  billToName  customerid  dateCompleted  dateCreated  dateIssued  num
1  Name1  1  6/27/18  6/23/18  6/23/18  ordernum1
2  Name1  1  7/15/18  7/10/18  7/10/18  ordernum2
3  Name1  1  7/29/18  7/20/18  7/20/18  ordernum3
4  Name2  2  6/31/2018  6/30/18  6/30/18  ordernum4
5  Name2  2  7/27/18  7/26/18  7/26/18  ordernum5
6  Name3  3  8/8/18  8/5/18  8/5/18  ordernum6
7  Name3  3  7/25/18  7/20/18  7/20/18  ordernum7

SOITEM table:

id  soId  unitPrice  dateLastFulfillment  productId  productNum  statusId  uomId  qtyOrdered
1  1  10  6/27/18  1  SKU-1  50  11  3
2  1  20  6/27/18  2  SKU-2  50  12  5
3  1  30  6/27/18  3  SKU-3  50  13  6
4  2  11  7/15/18  1  SKU-1  50  11  11
5  2  21  7/15/18  2  SKU-2  50  12  44
6  2  31  7/15/18  3  SKU-3  50  13  5
7  3  12  7/29/18  1  SKU-1  50  11  5
8  3  22  7/29/18  2  SKU-2  50  12  6
9  4  23  6/31/2018  2  SKU-2  50  12  9
10  4  33  6/31/2018  3  SKU-3  50  13  12
11  5  24  7/27/18  2  SKU-2  50  12  14
12  5  34  7/27/18  3  SKU-3  50  13  35
13  6  25  8/8/18  2  SKU-2  50  12  22
14  6  35  8/8/18  3  SKU-3  50  13  55
15  7  26  7/25/18  2  SKU-2  50  12  22
16  7  36  7/25/18  3  SKU-3  50  13  11

PRODUCT table:

num  uomid
SKU-1  11
SKU-2  12
SKU-3  13

UOM table:

id  code
11  cs10
12  cs20
13  cs30

CUSTOMER table:

ID  NAME
1  CUSTOMER1#
2  CUSTOMER2#
3  CUSTOMER3#

EXPECTED RESULTS:

type  SKU  unitPrice  priceList  max(soitem.dateLastFulfillment)
item  SKU-1  1.2  customer1  7/29/18
item  SKU-2  1.1  customer1  7/29/18
item  SKU-3  1.03  customer1  7/15/18
item  SKU-2  1.2  customer2  7/27/18
item  SKU-3  1.13  customer2  7/27/18
item  SKU-2  1.25  customer3  8/8/18
item  SKU-3  1.17  customer3  8/8/18

Try this, just the first part of your code, and see what you get. Then paste in your other Joins etc. (removing first two old where items, and all of the group by)

-- compute this once, instead of for each row
Declare @now_minus_6mos as date = DATEADD(month, -6, GETDATE());
print @now_minus_6mos;

select 
    'item' AS type, soitem.productnum as 'SKU',
    (soitem.unitprice / 1 ) as unitPrice,   -- I do not have UOM, so simplify to be one
    -- I do not have Customer    replace(customer.name, "#", "") AS priceList, 
    (soitem.dateLastFulfillment) -- remove the max, since we are getting only the last one
from 
    (Select * From
        (Select
            productnum
            ,unitprice
            ,dateLastFulfillment
            ,Row_Number() Over(Partition By productnum  Order By dateLastFulfillment DESC) as dlfRow
         From soitem
         --move where filters here to reduce number of rows returned
         Where
             soitem.dateLastFulfillment > @now_minus_6mos 
         and soitem.unitprice > 0 
         ) aa
     Where dlfRow = 1
     ) soitem

You can do this with "ranking" function. They doesn't exists in MySQL but you can imitate them.

See this post.

Rank function in MySQL

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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