PDA

View Full Version : سوال: نوشتن یک کوئری خاص



unique1984
شنبه 01 خرداد 1389, 08:24 صبح
با سلام
فرض کنید من دو جدول به صورت زیر دارم.


TblMaster
MasterId(pk) Name
====================
1001 a1
1002 a2
1003 a3



Tbldetails

DetailId(Pk) MasterId(Fk) Code Debtor Creditor
================================================== =============
1 1001 2 2000 -
2 1001 3 1000
3 1001 2 1000
---------------------------------------------------------------
4 1002 1 1500 -
5 1002 2 1500
---------------------------------------------------------------
6 1003 2 3500 -
7 1003 3 - 1500
8 1003 1 - 2000
می خوام کوئری بنویسم که از جدول TblDtails رکوردهایی نمایش داده بشند که code اونها در یک طبقه بندی هم بستانکارند هم بدهکار. چنین نتیجه ای رو میخوام.

Result

DetailId(Pk) MasterId(Fk) Code Debtor Creditor
================================================== =============
1 1001 2 2000 -
2 1001 3 1000
3 1001 2 1000

در خروجی داده شده ، code ی با شماره 2 هم بستانکار هستش هم بدهکار،و رکورد دیگه ای با code=3 وجود داره .
در واقع اگر در مجموعه رکوردهایی با MasterId یکسان، دو code یکسان با دو ماهیت مختلف یافت شد ، کل مجموعه رکوردها(با MasterId یکسان) نمایش داده بشند.
نکته اینکه میخوام با دستور ساده select باشه و از ساختار دیگه ای استفاده نشه.
مرسی

amir_alaki
شنبه 01 خرداد 1389, 09:30 صبح
با سلام

من متوجه نشدم که سوالتون دقیقا چیه
اگه میشه یکم واضحتر سوالتون رو مطرح کنین
(اون تیکه آخر رو نمی فهمم چی نوشتین)
موفق باشید

unique1984
شنبه 01 خرداد 1389, 12:21 عصر
این جداول در واقع جداول مربوط به سند حسابداری هستند که من فقط فیلدهایی که مرتبط به کوئری مورد نیازم بود رو نوشتم..
جدول TblMaster در واقع جدول اصلی سند هستش و جدول TblDetails جزئیات مربوط به هر سند.

حالا من میخوام جزئیات مربوط به سندی نمایش داده بشند که در اون جزئیات، یک حساب خاص هم بدهکاره هم بستانکار.(همون Result)

مثلا در سند شماره 1002 ، code=2 فقط بدهکاره و در سند شماره 1003، code=2 فقط بستانکاره.اما در سند 1001 این کد هم بدهکاره هم بستانکار و من باید فقط جزئیات مربوط به سند 1001 رو نمایش بدم.

programer1389
شنبه 01 خرداد 1389, 12:36 عصر
فکر کنم باید MasterId های دو جدول رو باهم join و سپس MasterId رو group by کنید

محمد سلیم آبادی
شنبه 01 خرداد 1389, 16:49 عصر
اینو امتحان کنید:


SELECT *
FROM Tbldetails T
INNER JOIN
(SELECT MasterId
FROM Tbldetails
GROUP BY MasterId, Code
HAVING COUNT(*) = 2) AS D
ON T.MasterId = D.MasterId

محمد سلیم آبادی
شنبه 01 خرداد 1389, 17:05 عصر
اینم امتحان کنید:


SELECT T.*
FROM Tbldetails T
INNER JOIN
(SELECT MasterId
FROM Tbldetails
GROUP BY MasterId, Code
HAVING COUNT(*) >= 2
AND MAX(CASE WHEN (Debtor IS NOT NULL AND Debtor <> 0)
THEN 1
ELSE 0
END) = 1
AND MAX(CASE WHEN (Creditor IS NOT NULL AND Creditor <> 0)
THEN 1
ELSE 0
END) = 1
) AS D
ON T.MasterId = D.MasterId;