PDA

View Full Version : كوئري بدست آوردن آخرين قيمت محصولات



sempaisaleh
یک شنبه 06 بهمن 1392, 12:59 عصر
با سلام خدمت دوستان
اگه ميشه بنده رو در نوشتن اين كوئري راهنمائي كنيد.
بنده يك جدول دارم به نام S_ODS_price كه توش كد محصولات(OD_CD) هست همراه با تاريخ اعمال قيمت(from_date) و مبلغ(price). يك جدول هم دارم به نام S_ODS كه محصولات توش داره( كد محصولاتOD_CD، نام محصولات OD_NM و وزن vazn). يه جدول هم دارم به نام S_DTL_T كه ريز مقدار محصولات توليد شده توش داره( كد محصولOD_CD و تعداد Tedad و تاريخ توليد). توليدات رو هم در جدول S_DTL_T وارد كردم. مي خوام بياد تعداد رو از اين جدول، نام كالا رو از جدول S_ODS و آخرين قيمت رو هم از جدول S_ODS_Price گرفته، و مقدارهاي زير رو برگردونه
نام كالا - جمع تعداد توليد شده اين كالا - تعداد رو در وزن ضرب كرده به عنوان يك فيلد تناژ بزاره - تعداد رو در قيمت ضرب كرده، به عنوان قيمت نهايي رو بذاره.

با تشكر

starting
یک شنبه 06 بهمن 1392, 13:53 عصر
الان دقیقه مشکلتون در کجاست؟ تجمیع کردن داده ها؟ پیوند و ادغام جداول؟ یا بدست آوردن آخرین قیمت هر محصول؟
نمیشه همه جداول را با هم اتصال داد سپس بر اساس ستون های مورد نظر گروه بندی کرد و با توابع تجمعی نتایج خلاصه شده و فشرده ای را بدست آورد؟

sempaisaleh
یک شنبه 06 بهمن 1392, 14:16 عصر
الان دقیقه مشکلتون در کجاست؟ تجمیع کردن داده ها؟ پیوند و ادغام جداول؟ یا بدست آوردن آخرین قیمت هر محصول؟
نمیشه همه جداول را با هم اتصال داد سپس بر اساس ستون های مورد نظر گروه بندی کرد و با توابع تجمعی نتایج خلاصه شده و فشرده ای را بدست آورد؟
با سلام
من اين تكه كد رو نوشتم مشكلم در بدست آوردن آخرين قيمت. وقتي اين رو مينويسم معلوم نيست ميره چيكا ميكنه. :لبخند:

SELECT S_DTL_T.mahsol_code, SUM(S_DTL_T.tedad) AS jame_tedad, DERIVEDTBL.p2
FROM S_DTL_T INNER JOIN
S_HED_T ON S_DTL_T.ID_T = S_HED_T.ID_T INNER JOIN
(SELECT p2, OD_CD
FROM S_ODS_Price
WHERE (From_Date < '92/11/05')
GROUP BY OD_CD, p2) DERIVEDTBL ON S_DTL_T.mahsol_code = DERIVEDTBL.OD_CD
GROUP BY S_DTL_T.mahsol_code, DERIVEDTBL.p2

starting
یک شنبه 06 بهمن 1392, 16:44 عصر
این نام گذاری جداول باعث نمیشه شما در شناسایی، تشخیص و تفکیک جداول از هم دچار اشتباه و سردرگمی بشید؟
بنظر اگر نام های مناسبتر انتخاب میکردین بهتر بود.

اما بدست آوردن آخرین قیمت؛ به منظور باید داده ها گروه بندی بشن، اگر منظورتون آخرین قیمت ثبت شده است که به این صورت می تونید عمل کنید:

SELECT TOP 1 *
FROM table
ORDER BY order_date DESC

Query فوق به عنوان یک Subquery که قرار هست جلوی FROM بیاد کاملا Legal و قانونی است.

اما مورد بعدی، اگر می خواهید آخرین قیمت اختصاص یافته به ازای هر محصول را بدست آورید. Query زیر مناسب اینکاره:

SELECT *
FROM table t
JOIN (
SELECT product, MAX(order_date) Mx
FROM table
GROUP BY product
)D
ON t.product = d.product
AND t.order_date = Mx.order_date

اما نکته ی باریکی اینجا هست اگر دیتاتایپ ستونی که تاریخ را در آن نگه می دارید از نوع date باشه و برای یک محصول در آخرین روز چند قیمت تعیین کردین تمام آن قیمت ها را میاره. حال برای رفع این مشکل میشه کار را به تابعی به نام ROW_NUMBER سپرد:


SELECT *
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY product ORDER BY order_date DESC) rnk , * FROM table)D
WHERE rnk = 1

sempaisaleh
دوشنبه 07 بهمن 1392, 08:00 صبح
این نام گذاری جداول باعث نمیشه شما در شناسایی، تشخیص و تفکیک جداول از هم دچار اشتباه و سردرگمی بشید؟
بنظر اگر نام های مناسبتر انتخاب میکردین بهتر بود.

اما بدست آوردن آخرین قیمت؛ به منظور باید داده ها گروه بندی بشن، اگر منظورتون آخرین قیمت ثبت شده است که به این صورت می تونید عمل کنید:

SELECT TOP 1 *
FROM table
ORDER BY order_date DESC

Query فوق به عنوان یک Subquery که قرار هست جلوی FROM بیاد کاملا Legal و قانونی است.

اما مورد بعدی، اگر می خواهید آخرین قیمت اختصاص یافته به ازای هر محصول را بدست آورید. Query زیر مناسب اینکاره:

SELECT *
FROM table t
JOIN (
SELECT product, MAX(order_date) Mx
FROM table
GROUP BY product
)D
ON t.product = d.product
AND t.order_date = Mx.order_date

اما نکته ی باریکی اینجا هست اگر دیتاتایپ ستونی که تاریخ را در آن نگه می دارید از نوع date باشه و برای یک محصول در آخرین روز چند قیمت تعیین کردین تمام آن قیمت ها را میاره. حال برای رفع این مشکل میشه کار را به تابعی به نام ROW_NUMBER سپرد:


SELECT *
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY product ORDER BY order_date DESC) rnk , * FROM table)D
WHERE rnk = 1
با سلام
دوست عزيز با تشكر از پاسخ تون. فقط يه مشكل كوچيك كدتون داره. كه اونم حل شد. دستت حسابي مرسي

SELECT *
FROM table t
JOIN (
SELECT product, MAX(order_date) Mx
FROM table
GROUP BY product
)D
ON t.product = d.product
AND t.order_date = D.MX