نقل قول: كمك در نوشتن كوئري
ميشه به عنوان مثال بگيد كه در اون داده هايي كه دادين بعد از اجرا بايد كدوم ها برگردن؟
آخه سوال يكم يا سخته يا زيادي ساده ست
نقل قول: كمك در نوشتن كوئري
باید یکی از این دو کوئری نتیجه ی مطلوب شما را برگردانند:
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;
نقل قول: كمك در نوشتن كوئري
به طور مثال در خروجي نمونه فوق بايد تاريخچه fan , pump را از 1/3/89 تا 30/3/89 نمايش دهد . چون آخرين وضعيت pump , fan در حالت 4 است و آخرين وضعيت motor در حالت 2 است . و motor نبايد در ليست باشد .
نقل قول: كمك در نوشتن كوئري
نقل قول:
نوشته شده توسط
yalameh
به طور مثال در خروجي نمونه فوق بايد تاريخچه fan , pump را از 1/3/89 تا 30/3/89 نمايش دهد . چون آخرين وضعيت pump , fan در حالت 4 است و آخرين وضعيت motor در حالت 2 است . و motor نبايد در ليست باشد .
پس شما باید کوئری دومی که پست کردم را استفاده کنید.
نقل قول: كمك در نوشتن كوئري
كد دوم شما را بر طبق نام فيلدهايم بصورت زير باز نويسي كردم :
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.
نقل قول: كمك در نوشتن كوئري
متاسفم، 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