Welcome to Sign in | Help
in Search

Select >> Update - SQL Server 2005

Last post 01-22-2009, 3:24 PM by rremus. 12 replies.
Sort Posts: Previous Next
  •  01-22-2009, 11:27 AM 6578

    Select >> Update - SQL Server 2005

    salut, am selectul urmator

    select B.CodContract from LBF B
    where B.DataReferinta='12/31/2008' and B.TipCredit=0
    and B.ValoareContract != (select sum(PrincipalPlatit+PrincipalRestant-AmendamentPrincipal)
          from LBF 
          where DataReferinta='12/31/2008' and TipCredit=0 and CodContract=B.CodContract and NodId=B.NodId
          group by CodContract)
    group by B.CodContract

    pot face un update pe tabela astfel incat  conditia

    B.ValoareContract != (select sum(PrincipalPlatit+PrincipalRestant-AmendamentPrincipal)
          from LBF 
          where DataReferinta='12/31/2008' and TipCredit=0 and CodContract=B.CodContract and NodId=B.NodId
          group by CodContract)


    sa fie satisfacuta, selectul acesta sa nu-mi returneze nimic, ma tot chinui dar nu-mi iese ma incurca rau ultimul group by.

    multumesc.

    alex.

  •  01-22-2009, 11:57 AM 6580 in reply to 6578

    Re: Select >> Update - SQL Server 2005

    Ar fi mai simplu daca ai prezenta si un script de creare a tabelelor + rezultate asteptate

    Cătălin D.
  •  01-22-2009, 12:19 PM 6581 in reply to 6578

    Re: Select >> Update - SQL Server 2005

    zau daca am inteles ce vrei ... Poti sa explici altfel ? (cum te "incurca" ... )
    Pe de alta parte, nu prea imi place DataReferinta='12/31/2008' ...esti convins ca merge?

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  01-22-2009, 12:46 PM 6582 in reply to 6578

    Re: Select >> Update - SQL Server 2005

    SELECT ...
    GROUP BY b.CodContract

    La ce anume se refera acel GROUP BY de la coada? Nu ai nici o functie agregat in select, deci nu ai de ce sa ai GROUP BY

    In general ce vrei tu se face mai usor si mai rapid printr-un self join, nu prin subquery. Asa pe ghicite as zice ca ceva de genul asta:

    select b.CodContract
    from LBF B
    join (select NodId, CodContract, sum(principalpaltit+principalrestant-amendamentprincipal) as sum
     from lbf
     where tipcredit=0
     and datareferinta='12/31/2008'
     group by codcontract
    ) s on b.codcontract=s.codcontract and b.nodid=s.nodid
    where datareferinta='12/31/2008'
    and tipcredit=0
    and b.valoarecontract != s.sum;

    Join-ul poate fi outer join, depinde de ce anume vrei.





    http://rusanu.com
  •  01-22-2009, 12:56 PM 6583 in reply to 6582

    Re: Select >> Update - SQL Server 2005

    Column 'LBF.NodId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  •  01-22-2009, 12:58 PM 6584 in reply to 6580

    Re: Select >> Update - SQL Server 2005

    CREATE TABLE [LBF] (
     [NodId] [int] NOT NULL ,
     [CodContract] [varchar] (20)  NOT NULL ,
     [CodCategorie] [varchar] (20)  NOT NULL ,
     [DataInregistrare] [datetime] NOT NULL ,
     [DataInregistrareAjustata] [datetime] NULL ,
     [CodClient] [int] NOT NULL ,
     [NumeClient] [varchar] (61)  NULL ,
     [Moneda] [varchar] (3)  NULL ,
     [DobandaPlatita] [money] NULL ,
     [PrincipalPlatit] [money] NULL ,
     [ComFlatFee] [money] NULL ,
     [ComRetailer] [money] NULL ,
     [ComAsigurari] [money] NULL ,
     [PrincipalRestant] [money] NULL ,
     [DobandaRestanta] [money] NULL ,
     [RataPlatita] [money] NULL ,
     [Sold] [money] NULL ,
     [DataReferinta] [datetime] NOT NULL ,
     [RataSchimbRONMedie] [decimal](30, 4) NULL ,
     [RataSchimbRON] [decimal](20, 10) NULL ,
     [SoldIRR] [money] NULL ,
     [ValoareContract] [money] NOT NULL ,
     [RataDobandaAnuala] [float] NULL ,
     [DurataCreditInitiala] [int] NOT NULL ,
     [DataInceputCredit] [datetime] NOT NULL ,
     [DataSfarsitCredit] [datetime] NULL ,
     [LuniScurse] [int] NOT NULL ,
     [LuniRamase] [int] NOT NULL ,
     [TipRezidentaClient] [varchar] (10)  NULL ,
     [TipCredit] [int] NOT NULL ,
     [Terminat] [int] NOT NULL ,
     [RataSchimbRONZi] [decimal](20, 13) NULL ,
     [AmendamentPrincipal] [money] NULL ,
     [ComAdministrareLunar] [money] NULL ,
     [ComAsigurareLunar] [money] NULL ,
     CONSTRAINT [iNodContractDataf] UNIQUE  NONCLUSTERED
     (
      [NodId],
      [CodContract],
      [DataReferinta],
      [DataInregistrareAjustata]
     ) WITH  FILLFACTOR = 20  ON [PRIMARY]
    ) ON [PRIMARY]
    GO


     

  •  01-22-2009, 1:01 PM 6585 in reply to 6583

    Re: Select >> Update - SQL Server 2005

    Alex:
    Column 'LBF.NodId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Nu poţi include NodID in GROUP BY sau să scrii SELECT MAX(NodID) ... ?
  •  01-22-2009, 1:52 PM 6589 in reply to 6583

    Re: Select >> Update - SQL Server 2005

    Alex:
    Column 'LBF.NodId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Si nu stii sa rezolvi asta?
    Pica, para malaiata, in gura lui Natafleata

    http://rusanu.com
  •  01-22-2009, 2:19 PM 6590 in reply to 6589

    Re: Select >> Update - SQL Server 2005

    :) nu e vorba ca nu stiu sa rezolv asta, doar ca intoarce inregistrari diferite fata de selectul initial

    alex.

  •  01-22-2009, 2:39 PM 6591 in reply to 6590

    Re: Select >> Update - SQL Server 2005

    Alex:

    selectul acesta sa nu-mi returneze nimic

    ...

    intoarce inregistrari diferite fata de selectul initial



    Deci inteleg ca asta intoarce ceva fata de cel initial care nu intorcea nimic.

    http://rusanu.com
  •  01-22-2009, 3:00 PM 6592 in reply to 6591

    Re: Select >> Update - SQL Server 2005

    selectul meu initial intoarce ceva  ~64.00 inregistrari (este o verificare), as vrea sa fac un update pe tabelul respectiv astfel incat la rularea selectului sa-mi intoarca 0 inregistrari...adica verificarea imi spune ca datele in tabel sunt corecte....ce nu ma descurc eu sa fac este scriptul update-lui respectiv....e mai clar acum?

    selectul tau modificat imi intoarce ~240.000 inregistrari

    multumesc.

    alex.

  •  01-22-2009, 3:22 PM 6594 in reply to 6592

    Re: Select >> Update - SQL Server 2005

    Alex:

    select B.CodContract from LBF B
    where B.DataReferinta='12/31/2008' and B.TipCredit=0
    and B.ValoareContract != (select sum(PrincipalPlatit+PrincipalRestant-AmendamentPrincipal)
          from LBF 
          where DataReferinta='12/31/2008' and TipCredit=0 and CodContract=B.CodContract and NodId=B.NodId
          group by CodContract)


    Acest select il citesc asa:
    din tabele LBF gaseste toate recordurile cu TipCredit = 0 si DataReferinta='12/31/2008' care au valoarea din ValoareContract diferita de suma (PrincipalPlatit+PrincipalRestant-AmendamentPrincipal) la toate recordurile din LFB cu TipCredit = 0 si DataReferinta='12/31/2008' si acelasi NodId si CodContract.

    Selectul meu i-tzi da acelasi lucru ca SQL correct. Insa ca 'business logic' este evident ca query-ul tau este incorect. Nu stiu ce reprezinta datele tale, nici nu ma intereseaza, dar daca tu compari un record X care are o valoare in CodContract si NodId cu o suma pe acelasi nodid si contract este evident ca daca unul satisface relatia, celelate din suma nu o pot. Matematic nu ai cum sa satisfaci criteriul tau decit data nodid si codcontract sint unice (adica fiecare combinatie are un singur record), ori ceva i-mi spune ca nu e asa (altfel n-ai fi folosit SUM).

    Deci mai bine gindestet-te care este conditia care o cauti. De exemplu poate tu de fapt cauti sa compari un TipCredit=0 cu SUM  la TipCredit !=0.

    http://rusanu.com
  •  01-22-2009, 3:24 PM 6596 in reply to 6594

    Re: Select >> Update - SQL Server 2005

    rremus:

    Matematic nu ai cum sa satisfaci criteriul tau decit data nodid si codcontract sint unice (adica fiecare combinatie are un singur record)


    De fapt asta nu chiar adevarat, dar ar fi foarte ciudat ca sa fie correct.

    http://rusanu.com
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems