Welcome to Sign in | Help
in Search

Script de SELECT ?

Last post 02-14-2007, 4:42 PM by Alex. 9 replies.
Sort Posts: Previous Next
  •  02-14-2007, 9:47 AM 1794

    Script de SELECT ?

    salut,

    am o tabela de genul (este afisata doar pt un anume SerialNumber)


    Product  Phase    SerialNumber   ComponentSerialNumber

    A            x            M04                     NULL
    A            y            M04                     NULL
    CR          x            M04                     0719
    CR          z            M04                     0719
    CR          y            M04                     0777
    CR         W            M04                     0719

    intrebarea mea este cum pot afla pt ce SerialNumber,ce Product si in ce faza este modificat ComponentSerialNumber
    in comparatie cu ComponentSerialNumber unde Phase este 'W'

    ideea e ca acest Product din SerialNumberul respectiv.....ideal ar fi ca el sa aiba acelasi ComponentSerialNumber
    in fiecare Phase de la inceput pana in Phase finala si anume 'W'. ComponentSerialNumber din Phase 'W' este cel corect...
    deci ma intereseaza in ce Phase si la ce Product,SerialNumber....acest ComponetSerialNumber difera de ComponetSerialNumber din Phase 'W'

    multumesc

  •  02-14-2007, 10:23 AM 1795 in reply to 1794

    Re: Script de SELECT ?

    declare @SerialNumber nvarchar(50),@Product nvarchar(50)
    set @SerialNumber = 'M04'
    set @Product = 'CR'
    select Product,Phase,SerialNumber,ComponentSerialNumber from HiperPL where SerialNumber = @SerialNumber and Product=@Product
      and ComponentSerialNumber <>(Select ComponentSerialNumber from HiperPL where SerialNumber = @SerialNumber and Phase = 'W'
      and  Product = @Product )
    order by Product

    cam asta as vrea sa-mi faca doar ca fara sa-i definesc eu variabilele....daca ii definesc eu variabilele ca mai sus e simplu.....dar vreau sa-mi faca pt toate Product si pt toate SerialNumber din tabela respectiva

  •  02-14-2007, 10:28 AM 1796 in reply to 1794

    Re: Script de SELECT ?

    Sper ca te-am inteles bine...deci ai nevoie de inregistrarile unde ComponentSerialNumber este diferit de 0719 (?)

    De exemplu defineste o variabila @good_no si seteaza valoarea la "SELECT ComponentSerialNumber FROM [Tabel] WHERE Phase = 'W' " (--->0719)

    Apoi selecteaza inregistrarile care au ComponentSerialNumber diferit de @good_no.

    Asta e un caz foarte simplu. Exista posibilitatea sa ai mai multe inregistrari cu Phase = 'W' si cu mai multe valori ale ComponentSerialNumber? Poti sa predefinesti un set de valori corecte ale ComponentSerialNumber? etc...

     

  •  02-14-2007, 10:43 AM 1797 in reply to 1796

    Re: Script de SELECT ?

    multumesc Diana pt interes.....intradevar asta e ideea

    deci pt Phase 'W' am un anume ComponentSerialNumber (sa zicem ca asta e cel corect...final)....si nu am cum sa definesc un set de valori corecte pt ca sunt mii de inregistrari in tabela si nu am de unde sa stiu cu ce ComponentSerialNumber ajung ele in tabela respectiva

    ideea e ca trebuie sa-mi scoata din tabela doar inregistrarile unde ComponentSerialNumber de la Phase 'W' nu corespunde cu ComponentSerialNumber de la celelalte Phase si sa compare pt fiecared SerialNumber si Product in parte....si fara sa fiu nevoit sa definesc eu Product sau SerialNumber

  •  02-14-2007, 10:51 AM 1798 in reply to 1797

    Re: Script de SELECT ?

    am marit putin tabela poate asa ma fac mai bine inteles

    Product  Phase    SerialNumber   ComponentSerialNumber

    A            x            M04                     01212

    A            y            M04                      01212

    A            y            M04                      00000

    A            W           M04                      01212

    CR          x            M04                     0719
    CR          z            M04                     0719
    CR          y            M04                     0777
    CR         W            M04                     0719

    TT          x            Z04                     00333
    TT         z            Z04                     00333
    TT         y            Z04                     00111
    TT        W            Z04                     00111

    cred ca trebuie facut un cursor care trebuie sa-mi ia fiecare inregistrae grupata functie de Product,SerialNumber si sa-mi compare ComponentSerialNumber al fiecarei inregistrare cu ComponentSerialNumber al inregistrarii unde Phase este 'W'

    daca intradevar se poate face cu un cursor atunci am o problema ca nu am mai facut asta :)

  •  02-14-2007, 11:34 AM 1799 in reply to 1798

    Re: Script de SELECT ?

    Atunci când ai o întrebare de acest gen, cel mai bine este să postezi de la început "DDL, sample data and expected results", aşa cum e scris în http://www.aspfaq.com/etiquette.asp?id=5006. În acest caz, acestea ar putea fi astfel:

    CREATE TABLE HiperPL (
        Product varchar(10),
        Phase varchar(10)
        SerialNumber varchar(10),
        ComponentSerialNumber varchar(10)
    )

    INSERT INTO HiperPL VALUES ('A','x','M04','01212')
    INSERT INTO HiperPL VALUES ('A','y','M04','01212')
    INSERT INTO HiperPL VALUES ('A','y','M04','00000')
    INSERT INTO HiperPL VALUES ('A','W','M04','01212')

    INSERT INTO HiperPL VALUES ('CR','x','M04','0719')
    INSERT INTO HiperPL VALUES ('CR','z','M04','0719')
    INSERT INTO HiperPL VALUES ('CR','y','M04','0777')
    INSERT INTO HiperPL VALUES ('CR','W','M04','0719')

    INSERT INTO HiperPL VALUES ('TT','x','Z04','00333')
    INSERT INTO HiperPL VALUES ('TT','z','Z04','00333')
    INSERT INTO HiperPL VALUES ('TT','y','Z04','00111')
    INSERT INTO HiperPL VALUES ('TT','W','Z04','00111')

    În lipsa unor alte informaţii, DDL-ul (structura tabelelor) de mai sus este incomplet, pentru că nu conţine PRIMARY KEY, nu menţionează dacă coloanele permit NULL-uri, iar tipurile şi dimensiunile coloanelor sunt estimative (iar în general ar trebui precizate şi eventualele FOREIGN KEY-uri, CHECK CONSTRAINT-uri, UNIQUE CONSTRAINT-uri).

    Presupun că rezultatele dorite sunt:

    Product    Phase      SerialNumber ComponentSerialNumber
    ---------- ---------- ------------ ---------------------
    A          y          M04          00000
    CR         y          M04          0777
    TT         x          Z04          00333
    TT         z          Z04          00333
    (4 row(s) affected)

    În acest caz, poţi să utilizezi şi un cursor, dar nu este recomandabil, deoarece soluţia se poate obţine mult mai uşor printr-un singur SELECT:

    SELECT * FROM HiperPL a WHERE ComponentSerialNumber<>(
      SELECT DISTINCT ComponentSerialNumber FROM HiperPL b
      WHERE b.Product=a.Product AND b.Phase='W'
    )

    Lipsa unui PRIMARY KEY îşi spune cuvântul în acest query. Ce s-ar întâmpla dacă ar exista două rânduri pentru acelaşi produs, cu phase='W' şi cu ComponentSerialNumber-uri diferite ? Care ar fi cel corect ? Pentru că nu avem o regulă pe baza căreia să îl putem determina pe cel corect, query-ul de mai sus va da o eroare (ceva de genul "Subquery returned more than one value").

    Răzvan 

  •  02-14-2007, 11:34 AM 1800 in reply to 1798

    Re: Script de SELECT ?

    Poti folosi o procedura cu parametrii "Product" si "Phase" care sa iti "intoarca" inregistrarile pentru un produs anume, cam asa:

    DECLARE @g varchar(10)
    SET @g = (SELECT ComponentSerialNumber FROM <Tabel> WHERE Phase = 'W' AND Product = 'A')
    SELECT * FROM <Tabel> WHERE Product = 'A' AND ComponentSerialNumber <> @g

    ** In loc de 'A' si de 'W', pune parametri. Daca 'W' e "batut in cuie", poate fi "hard coded" (?)

     Procedura poate fi executata intr-un cursor pe produse.

    *In general e mai bine sa eviti cursoarele in SQL. Eu as scrie o aplicatie .NET (de consola) foarte simpla si rapida, care ar accesa produsele intr-un "reader" si ar executa procedura pentru fiecare record din reader. Datele obtinute le-as aduna intr-un fisier text/csv, sau le-as importa direct in db...in fine, nu stiu ce "work flow"trebuie urmat...

  •  02-14-2007, 2:33 PM 1802 in reply to 1800

    Re: Script de SELECT ?

    am reusit sa-l fac astfel....cu un cursor:

    declare @SerialNumber nvarchar(50),@Product nvarchar(50),
            @Phase nvarchar(50),@ComponentSerialNumber nvarchar(50)

    DECLARE pers CURSOR FOR
     select Product,SerialNumber,Phase,ComponentSerialNumber from HiperPL  where Phase = 'W' 
     GROUP By Product,SerialNumber,Phase,ComponentSerialNumber

    OPEN pers

    FETCH NEXT FROM pers
    INTO @Product,@SerialNumber,@Phase,@ComponentSerialNumber


    WHILE @@FETCH_STATUS = 0
    BEGIN

     select Product,Phase,SerialNumber,ComponentSerialNumber from HiperPL
      WHERE Product=@Product AND SerialNumber=@SerialNumber
         AND ComponentSerialNumber <> (SELECT TOP 1 ComponentSerialNumber FROM HiperPL
                  where Product=@Product AND SerialNumber=@SerialNumber AND Phase=@Phase order by ActivatingTime desc)
     order by Product

    FETCH NEXT FROM pers
    INTO @Product,@SerialNumber,@Phase,@ComponentSerialNumber
    END

    CLOSE pers
    DEALLOCATE pers

    functioneza f bine....problema acum e ca dureaza f mult.......as putea sa transform acest cursor intr-un simplu SELECT?....cum ar putea arata asta

  •  02-14-2007, 3:08 PM 1803 in reply to 1802

    Re: Script de SELECT ?

    Echivalentul cursorului tău ar fi următoarea instrucţiune: 

    SELECT Product, Phase, SerialNumber, ComponentSerialNumber FROM HiperPL a
    WHERE ComponentSerialNumber <> (
      SELECT TOP 1 ComponentSerialNumber FROM HiperPL b
      WHERE a.Product=b.Product AND a.SerialNumber=b.SerialNumber AND a.Phase=b.Phase
      AND b.Phase='W'
      ORDER BY ActivatingTime DESC
    ) ORDER BY Product

    Dar nu cred că e ceea ce îţi doreşti, o să raporteze doar seriile diferite pentru Phase='W' (nu compară nimic pentru celelalte faze). Conform cerinţei din mesajul tău anterior, cred că vrei să scoţi porţiunea subliniată din query-ul de mai sus, ca să verifice toate ComponentSerialNumber-urile (din toate Phase-urile unui Produs+SerialNumber) cu cel ales din Phase='W'.

    Răzvan 

  •  02-14-2007, 4:42 PM 1804 in reply to 1803

    Re: Script de SELECT ?

    da...intradevar e perfect mai putin conditia subliniata...e exact ce vroiam.....reusisem si eu sa-l fac intr-un final.....multumesc mult
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems