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.
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.