PDA

View Full Version : كمك در نوشتن كوئري



yalameh
سه شنبه 25 خرداد 1389, 15:53 عصر
سلام دوستان
جدولي دارم كه شامل وضعيت تجهيزات در تاريخهاي مختلف بصورت زير مي باشد . مي خواهم كوئري بنويسم كه ركوردهائي كه آخرين وضعيت تجهيزات در حالت 4 مي باشد ، تاريخچه آنها را از مثلا 1/3/89 تا 30/3/89 بدهد .

MachineCode TestDate Status
... ... ....
... ... ....
... ... ....
fan 2/3/89 1
Motor 10/3/89 2
Pump 15/3/89 3
fan 20/3/89 4
Pump 25/3/89 4

Rejnev
سه شنبه 25 خرداد 1389, 16:02 عصر
ميشه به عنوان مثال بگيد كه در اون داده هايي كه دادين بعد از اجرا بايد كدوم ها برگردن؟
آخه سوال يكم يا سخته يا زيادي ساده ست

محمد سلیم آبادی
سه شنبه 25 خرداد 1389, 16:43 عصر
باید یکی از این دو کوئری نتیجه ی مطلوب شما را برگردانند:


SELECT t.*
FROM table t
JOIN
(
SELECT MachineCode, MAX(TestDate) AS Date
FROM table
GROUP BY MachineCode
) D
on T.MachineCode = D.MachineCode
AND T.Date = D.Date
WHERE AND T.Status = 4
AND TestDate BETWEEN Start AND End;
-- OR
SELECT T.*
FROM table T
JOIN
(
SELECT T.MachineCode
FROM table t
JOIN
(
SELECT MachineCode, MAX(TestDate) AS Date
FROM table
GROUP BY MachineCode
) D
on T.MachineCode = D.MachineCode
AND T.Date = D.Date
WHERE AND T.Status = 4
) D ON T.MachineCode = D.MachineCode
WHERE TestDate BETWEEN Start AND End;

yalameh
چهارشنبه 26 خرداد 1389, 10:09 صبح
به طور مثال در خروجي نمونه فوق بايد تاريخچه fan , pump را از 1/3/89 تا 30/3/89 نمايش دهد . چون آخرين وضعيت pump , fan در حالت 4 است و آخرين وضعيت motor در حالت 2 است . و motor نبايد در ليست باشد .

محمد سلیم آبادی
چهارشنبه 26 خرداد 1389, 10:51 صبح
به طور مثال در خروجي نمونه فوق بايد تاريخچه fan , pump را از 1/3/89 تا 30/3/89 نمايش دهد . چون آخرين وضعيت pump , fan در حالت 4 است و آخرين وضعيت motor در حالت 2 است . و motor نبايد در ليست باشد .

پس شما باید کوئری دومی که پست کردم را استفاده کنید.

yalameh
چهارشنبه 26 خرداد 1389, 11:26 صبح
كد دوم شما را بر طبق نام فيلدهايم بصورت زير باز نويسي كردم :




ALTER PROCEDURE [dbo].[SP_Tahlil] @date1 AS NVArchar(10) ,@date2 AS NVArchar(10),@Type as integer As

select @date1= isnull (@date1, '0000/00/00')
select @date2= isnull (@date2, '9999/99/99')

If @Type = 1
Begin

SELECT T.*
FROM View_Current T
JOIN
(
SELECT T.MachineCode
FROM View_Current t
JOIN
(
SELECT MachineCode, MAX(TestDate) AS Date
FROM View_Current
) D
on T.MachineCode = D.MachineCode
AND T.TestDate = D.Date
WHERE T.StatusID = 4
) D ON T.MachineCode = D.MachineCode
WHERE TestDate BETWEEN @date1 AND @date2;


End

GO



كه در اينصورت خطاي زير رخ داد :


Msg 8120, Level 16, State 1, Procedure SP_Tahlil, Line 17
Column 'View_Current.MachineCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

محمد سلیم آبادی
چهارشنبه 26 خرداد 1389, 11:34 صبح
متاسفم، GROUP BY را فراموش کردم بنویسم (یا اینکه در Note Pad حذف شده بود)
اینو امتحان کنید

USE [RMI]
GO
ALTER PROCEDURE [dbo].[SP_Tahlil] @date1 AS NVArchar(10) ,@date2 AS NVArchar(10),@Type as integer As
begin
select @date1= isnull (@date1, '0000/00/00')
select @date2= isnull (@date2, '9999/99/99')

If @Type = 1
Begin
SELECT T.*
FROM View_Current T
JOIN
(
SELECT T.MachineCode
FROM View_Current t
JOIN
(
SELECT MachineCode, MAX(TestDate) AS Date
FROM View_Current
GROUP BY MachineCode
) D
on T.MachineCode = D.MachineCode
AND T.TestDate = D.Date
WHERE T.StatusID = 4
) D ON T.MachineCode = D.MachineCode
WHERE TestDate BETWEEN @date1 AND @date2;
End
end
GO