نمایش نتایج 1 تا 7 از 7

نام تاپیک: كمك در نوشتن كوئري

  1. #1
    کاربر تازه وارد آواتار yalameh
    تاریخ عضویت
    آبان 1383
    محل زندگی
    اصفهان
    پست
    73

    كمك در نوشتن كوئري

    سلام دوستان
    جدولي دارم كه شامل وضعيت تجهيزات در تاريخهاي مختلف بصورت زير مي باشد . مي خواهم كوئري بنويسم كه ركوردهائي كه آخرين وضعيت تجهيزات در حالت 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

  2. #2

    نقل قول: كمك در نوشتن كوئري

    ميشه به عنوان مثال بگيد كه در اون داده هايي كه دادين بعد از اجرا بايد كدوم ها برگردن؟
    آخه سوال يكم يا سخته يا زيادي ساده ست

  3. #3

    نقل قول: كمك در نوشتن كوئري

    باید یکی از این دو کوئری نتیجه ی مطلوب شما را برگردانند:

    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;
    آخرین ویرایش به وسیله محمد سلیم آبادی : چهارشنبه 26 خرداد 1389 در 11:47 صبح
    وبلاگ من (Advanced SQL Querying)

  4. #4
    کاربر تازه وارد آواتار yalameh
    تاریخ عضویت
    آبان 1383
    محل زندگی
    اصفهان
    پست
    73

    نقل قول: كمك در نوشتن كوئري

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

  5. #5

    نقل قول: كمك در نوشتن كوئري

    نقل قول نوشته شده توسط yalameh مشاهده تاپیک
    به طور مثال در خروجي نمونه فوق بايد تاريخچه fan , pump را از 1/3/89 تا 30/3/89 نمايش دهد . چون آخرين وضعيت pump , fan در حالت 4 است و آخرين وضعيت motor در حالت 2 است . و motor نبايد در ليست باشد .
    پس شما باید کوئری دومی که پست کردم را استفاده کنید.
    وبلاگ من (Advanced SQL Querying)

  6. #6
    کاربر تازه وارد آواتار yalameh
    تاریخ عضویت
    آبان 1383
    محل زندگی
    اصفهان
    پست
    73

    نقل قول: كمك در نوشتن كوئري

    كد دوم شما را بر طبق نام فيلدهايم بصورت زير باز نويسي كردم :



    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.

  7. #7

    نقل قول: كمك در نوشتن كوئري

    متاسفم، 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
    وبلاگ من (Advanced SQL Querying)

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •