PDA

View Full Version : سوال: مشکل با دستور pivot



navid1n2000
دوشنبه 20 اردیبهشت 1389, 09:08 صبح
من یک کوری دارم به این شرح :

SELECT TOP (100) PERCENT SarVamID, ShOzviat, MahId, SalId, GhestSarPrice, SumSar
FROM dbo.SarVams
WHERE (SalId = '9')
GROUP BY ShOzviat, MahId, GhestSarPrice, SalId, SarVamID, SumSar
ORDER BY ShOzviat
اینم نتیجه ش:
http://irupload.ir/images/o80rwiz03tcmtnppvlmj.jpg
این نتیجه دلخواه من نیست . من می خوام اقساط سرمایه هر عضو رو سالانه در بیارم مثلا برای عضو شماره 3001 در سال 9 :
http://irupload.ir/images/j4hj27xubss0kc96ooy.jpg
پرسیدم گفتن باید از دستور pivot استفاده کنی
اما من هر کاری کردم نتونستم
میشه راهنماییم کنین؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

محمد سلیم آبادی
دوشنبه 20 اردیبهشت 1389, 14:54 عصر
SELECT ShOzviat,
MAX(CASE WHEN MahId = '1' THEN GhestSarPrice ELSE 0 END) AS [1],
MAX(CASE WHEN MahId = '2' THEN GhestSarPrice ELSE 0 END) AS [2],
MAX(CASE WHEN MahId = '3' THEN GhestSarPrice ELSE 0 END) AS [3],
MAX(CASE WHEN MahId = '4' THEN GhestSarPrice ELSE 0 END) AS [4],
MAX(CASE WHEN MahId = '5' THEN GhestSarPrice ELSE 0 END) AS [5],
MAX(CASE WHEN MahId = '6' THEN GhestSarPrice ELSE 0 END) AS [6],
MAX(CASE WHEN MahId = '7' THEN GhestSarPrice ELSE 0 END) AS [7],
MAX(CASE WHEN MahId = '8' THEN GhestSarPrice ELSE 0 END) AS [8],
MAX(CASE WHEN MahId = '9' THEN GhestSarPrice ELSE 0 END) AS [9],
MAX(CASE WHEN MahId = '10' THEN GhestSarPrice ELSE 0 END) AS [10],
MAX(CASE WHEN MahId = '11' THEN GhestSarPrice ELSE 0 END) AS [11],
MAX(CASE WHEN MahId = '12' THEN GhestSarPrice ELSE 0 END) AS [12]
FROM dbo.SarVams
WHERE salID = '9'
GROUP BY ShOzviat

navid1n2000
دوشنبه 20 اردیبهشت 1389, 21:49 عصر
SELECT ShOzviat,
MAX(CASE WHEN MahId = '1' THEN GhestSarPrice ELSE 0 END) AS [1],
MAX(CASE WHEN MahId = '2' THEN GhestSarPrice ELSE 0 END) AS [2],
MAX(CASE WHEN MahId = '3' THEN GhestSarPrice ELSE 0 END) AS [3],
MAX(CASE WHEN MahId = '4' THEN GhestSarPrice ELSE 0 END) AS [4],
MAX(CASE WHEN MahId = '5' THEN GhestSarPrice ELSE 0 END) AS [5],
MAX(CASE WHEN MahId = '6' THEN GhestSarPrice ELSE 0 END) AS [6],
MAX(CASE WHEN MahId = '7' THEN GhestSarPrice ELSE 0 END) AS [7],
MAX(CASE WHEN MahId = '8' THEN GhestSarPrice ELSE 0 END) AS [8],
MAX(CASE WHEN MahId = '9' THEN GhestSarPrice ELSE 0 END) AS [9],
MAX(CASE WHEN MahId = '10' THEN GhestSarPrice ELSE 0 END) AS [10],
MAX(CASE WHEN MahId = '11' THEN GhestSarPrice ELSE 0 END) AS [11],
MAX(CASE WHEN MahId = '12' THEN GhestSarPrice ELSE 0 END) AS [12]
FROM dbo.SarVams
WHERE salID = '9'
GROUP BY ShOzviat


خیلی ممنون
اما یه مشکلی هست
این کوری شما ماکس رو حساب می کنه . ولی ممکنه قسط یک نفر چند بار عوض بشه اما این کوری بزرگترینش رو انتخاب می کنه
راه حل من چیه که دقیقا همون مقداری رو بده که توی همون ماه و توی همون سال پرداخت کرده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

محمد سلیم آبادی
دوشنبه 20 اردیبهشت 1389, 22:06 عصر
ولی ممکنه قسط یک نفر چند بار عوض بشه
مگر برای یک شخص در یک سال و در یک ماه میشود بیش از یک سطر در نظر گرفت؟
کوئری را روی داده هایتان اجرا کردین و نتیجه نگرفتین، یا اینکه از روی تحلیل کوئری این نتیجه رو گرفتین؟

navid1n2000
دوشنبه 20 اردیبهشت 1389, 22:26 عصر
مگر برای یک شخص در یک سال و در یک ماه میشود بیش از یک سطر در نظر گرفت؟
کوئری را روی داده هایتان اجرا کردین و نتیجه نگرفتین، یا اینکه از روی تحلیل کوئری این نتیجه رو گرفتین؟
این مشکلم حل شده
حالا یه سوال دیگه
میخوام یه شرط بذارم
چطور میشه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟
من خودم کوری شما رو تغییر دادم :


SELECT dbo.SarVams.ShOzviat As [ ], dbo.Ozu.FName As [], dbo.Ozu.LName As [ ], MAX(CASE WHEN SarVams.MahId = '12' AND SarVams.SalId = '" + (int.Parse(Saldatar) - 1).ToString() + "' THEN MandeVam ELSE 0 END) AS [ ], MAX(CASE WHEN SarVams.MahId = '1' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '2' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '3' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '4' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '5' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '6' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '7' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '8' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '" + Saldatar + "' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '10' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS , MAX(CASE WHEN SarVams.MahId = '11' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS ,MAX(CASE WHEN SarVams.MahId = '12' AND SarVams.SalId = '" + Saldatar + "' THEN GhestVamPrice ELSE 0 END) AS ,MAX(CASE WHEN SarVams.MahId = '12' AND SarVams.SalId = '" + Saldatar + "' THEN MandeVam ELSE 0 END) AS [ ] FROM Ozu INNER JOIN SarVams ON Ozu.ShOzviat = SarVams.ShOzviat GROUP BY dbo.SarVams.ShOzviat, dbo.Ozu.FName, dbo.Ozu.LName ORDER BY dbo.SarVams.ShOzviat

الان که یک ماه از سال گذشته هر نفر فقط یک قسط وام پرداخت کرده
ولی توی ردیف آخر که جمع سال رو میده صفر میذاره
من می خوام طوری باشه که اگه صفر بود و هنوز وامش از سال قبل مونده بود هی یه ماه بیاد عقب تا مانده وامی که مخالف صفر هست رو بده
در کل کمکم کنین که چطور اینجا از یه شرط استفاده کنم

محمد سلیم آبادی
سه شنبه 21 اردیبهشت 1389, 02:18 صبح
در کل من متوجه نمی شم.
می تونید یک نمونه از داده های خامتون را با نتیجه ای که مورد نظرتون هست در اینجا قرار بدین؟

درسته اگر فرد قسط ماهی را نداده باشه در گزارش صفر نمایش داده میشه.
و منظورتون از ردیف آخر (که جمع سال را میده) متوجه نمیشم
و کدی که قرار دادین مفهوم نیست. اگر امکان داره تنها کوئری خالص را قرار بدین.
و این SalVamID در جدول چه حکمی داره؟