Welcome to Sign in | Help
in Search

t-sql update sql server 2000

Last post 02-17-2009, 5:03 PM by Alex. 11 replies.
Sort Posts: Previous Next
  •  02-17-2009, 2:04 PM 6779

    t-sql update sql server 2000

    salut, ma puteti ajuta va rog cu un update

    am tabela urmatoare

    create table aaa (

    [NodId] [int] NOT NULL ,

    [CodContract] [varchar] (20) 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

    ) ON [PRIMARY]

    GO

    in care am mii de "CodContract"-e si fiecare cu data lui "DataInregistrare"

    un exemplu de select cu clauza where pe tabela pt "select * from aaa where CodContract = 'LD0800103084'   order by DataInregistrare asc" arata asa:

    NodId    CodContract    CodCategorie       DataInregistrare       ....... Principal
    10    LD0800103084    21068_225    2007-03-16 00:00:00.000 ........ 0
    10    LD0800103084    21068_225    2007-03-23 00:00:00.000 ........ 200
    10    LD0800103084    21068_225    2007-04-23 00:00:00.000 ........ 192
    10    LD0800103084    21068_225    2007-05-23 00:00:00.000 ........ 192
    10    LD0800103084    21068_225    2007-06-22 00:00:00.000 ........ 192

    ma intereseaza sa fac un update principal = 0 pe inregistrarea top 2 order by DataInregistare asc pt. toate CodContractele care au aceeasi luna (si an) la DataInregistrare pe primele 2 inregistrari pe fiecare contract in parte (ordonate dupa DataInregistrare asc)

    dupa update as vrea sa arate asa:

    NodId    CodContract    CodCategorie       DataInregistrare       ....... Principal
    10    LD0800103084    21068_225    2007-03-16 00:00:00.000 ........ 0
    10    LD0800103084    21068_225    2007-03-23 00:00:00.000 ........ 0
    10    LD0800103084    21068_225    2007-04-23 00:00:00.000 ........ 192
    10    LD0800103084    21068_225    2007-05-23 00:00:00.000 ........ 192
    10    LD0800103084    21068_225    2007-06-22 00:00:00.000 ........ 192

    tabela are ~ 1 milion inregistrari

    multumesc

    alex.

  •  02-17-2009, 2:15 PM 6780 in reply to 6779

    Re: t-sql update sql server 2000

    Încearcă ceva de genul:

    UPDATE aaa SET Principal=0
    WHERE DataInregistrare IN (
    SELECT TOP 2 DataInregistrare FROM aaa b
    WHERE b.CodContract=aaa.CodContract
    ORDER BY DataInregistrare
    )

    Răzvan
  •  02-17-2009, 2:20 PM 6781 in reply to 6780

    Re: t-sql update sql server 2000

    Acum am observat şi chestia cu "aceeasi luna (si an) la DataInregistrare pe primele 2 inregistrari". În cazul acesta ar fi:

    UPDATE aaa SET Principal=0 
    WHERE DataInregistrare IN ( 
     SELECT TOP 2 DataInregistrare FROM aaa b 
     WHERE b.CodContract=aaa.CodContract 
     AND DATEDIFF(month, DataInregistrare, ( 
      SELECT MIN(DataInregistrare) FROM aaa c 
      WHERE c.CodContract=b.CodContract 
     ))=0 
     ORDER BY DataInregistrare 
    ) 

  •  02-17-2009, 2:26 PM 6782 in reply to 6780

    Re: t-sql update sql server 2000

    nu cred ca e ce-mi trebuie pt ca o sa faca update si in cazul asta:

    NodId    CodContract    CodCategorie       DataInregistrare            Principal
    7       LD0800100419    21062_224    2007-10-23 00:00:00.000    0
    7       LD0800100419    21062_224    2007-11-19 00:00:00.000    345
    7       LD0800100419    21062_224    2007-12-19 00:00:00.000    234
    7       LD0800100419    21062_224    2008-01-18 00:00:00.000    435
    7       LD0800100419    21062_224    2008-02-18 00:00:00.000    345

    unde nu ar trebui pt ca luna de pe rima inregistrare difera de luna de pe a 2-a inregistrare

    alex.

    edit: multumesc, testez acum

  •  02-17-2009, 2:44 PM 6783 in reply to 6781

    Re: t-sql update sql server 2000

    primesc eroare

    Msg 512, Level 16, State 1, Line 1

    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    The statement has been terminated.

    alex.

  •  02-17-2009, 2:58 PM 6784 in reply to 6783

    Re: t-sql update sql server 2000

    Sorry, am corectat mai sus... trebuia IN in loc de =.

    Răzvan

  •  02-17-2009, 3:47 PM 6785 in reply to 6784

    Re: t-sql update sql server 2000

    dar updateul se face si pe prima inregistrare nu doar pe cea de-a 2-a

    si anume pt o inregistrare de genul:

    NodId          CodContract       CodCategorie          DataInregistrare            PLATIT
    7          LD0800100420       21062_224          2007-11-19 00:00:00.000      254
    7          LD0800100420       21062_224          2007-11-23 00:00:00.000      155
     
    7          LD0800100420       21062_224          2007-12-19 00:00:00.000      654
    7          LD0800100420       21062_224          2008-01-18 00:00:00.000      624
    7          LD0800100420       21062_224          2008-02-18 00:00:00.000      897

    O SA DEVINA

    NodId          CodContract       CodCategorie          DataInregistrare            PLATIT
    7          LD0800100420       21062_224          2007-11-19 00:00:00.000      0
    7          LD0800100420       21062_224          2007-11-23 00:00:00.000      0

    7          LD0800100420       21062_224          2007-12-19 00:00:00.000      654
    7          LD0800100420       21062_224          2008-01-18 00:00:00.000      624
    7          LD0800100420       21062_224          2008-02-18 00:00:00.000      897

    sau ma insel?

    multumesc.

    alex.

  •  02-17-2009, 4:14 PM 6786 in reply to 6785

    Re: t-sql update sql server 2000

    Într-adevăr, UPDATE-ul de mai sus se face pe primele două înregistrări (aşa înţelesesem că trebuie). Dacă trebuie doar pe a doua înregistrare, atunci putem face ceva de genul:

    UPDATE aaa SET Principal=0
    WHERE DataInregistrare = (
    SELECT MIN(DataInregistrare) FROM aaa b
    WHERE b.CodContract=aaa.CodContract
    AND DataInregistrare>(
    SELECT MIN(DataInregistrare) FROM aaa c
    WHERE c.CodContract=aaa.CodContract
    )
    AND DATEDIFF(month, DataInregistrare, (
    SELECT MIN(DataInregistrare) FROM aaa d
    WHERE d.CodContract=aaa.CodContract
    ))=0
    ORDER BY DataInregistrare
    )

    Obs1: pentru ca performanţa să fie acceptabilă, ar fi bine să existe un index compus pe coloanele CodContract şi DataInregistrare.

    Obs2: pentru a obţine rezultate corecte, ar trebui să ne asigurăm că nu există două înregistrări în aceeaşi dată, pe acelaşi contract; cu alte cuvinte, indexul menţionat mai sus ar trebui să fie unic.

    Răzvan
  •  02-17-2009, 4:32 PM 6787 in reply to 6786

    Re: t-sql update sql server 2000

    syntaxa e gresita

    am eroarea

    Msg 1033, Level 15, State 1, Line 14

    The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

    si daca folosesc top 100 percent adica:

    UPDATE aaa SET Principal=0

    WHERE DataInregistrare = (

    SELECT top 100 percent MIN(DataInregistrare) FROM aaa b

    WHERE b.CodContract=aaa.CodContract

    AND DataInregistrare>(

    SELECT MIN(DataInregistrare) FROM aaa c

    WHERE c.CodContract=aaa.CodContract

    )

    AND DATEDIFF(month, DataInregistrare, (

    SELECT MIN(DataInregistrare) FROM aaa d

    WHERE d.CodContract=aaa.CodContract

    ))=0

    ORDER BY DataInregistrare

    )

    am eroarea

    Msg 8127, Level 16, State 1, Line 1

    Column "aaa.DataInregistrare" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

    alex.

  •  02-17-2009, 4:39 PM 6788 in reply to 6786

    Re: t-sql update sql server 2000

    e corect asa?

    UPDATE aaa SET Principal= 0

    WHERE DataInregistrare IN (

    SELECT TOP 2 DataInregistrare

    FROM aaa b

    WHERE b.CodContract=aaa.CodContract

    AND DATEDIFF(month, DataInregistrare, ( SELECT MIN(DataInregistrare)

    FROM aaa c

    WHERE c.CodContract=b.CodContract

    )

    ) = 0

    and DataInregistrare > ( SELECT MIN(DataInregistrare)

    FROM aaa c

    WHERE c.CodContract=aaa.CodContract)

    ORDER BY DataInregistrare asc

    )

    multumesc.

    alex.

  •  02-17-2009, 4:43 PM 6789 in reply to 6787

    Re: t-sql update sql server 2000

    ORDER BY-ul era în plus... de fapt vroiam să zic:

    UPDATE aaa SET Principal=0
    WHERE DataInregistrare = (
    SELECT MIN(DataInregistrare) FROM aaa b
    WHERE b.CodContract=aaa.CodContract
    AND DataInregistrare>(
    SELECT MIN(DataInregistrare) FROM aaa c
    WHERE c.CodContract=aaa.CodContract
    )
    AND DATEDIFF(month, DataInregistrare, (
    SELECT MIN(DataInregistrare) FROM aaa d
    WHERE d.CodContract=aaa.CodContract
    ))=0
    )
  •  02-17-2009, 5:03 PM 6790 in reply to 6789

    Re: t-sql update sql server 2000

    perfect, multumesc mult

    alex.

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems