Grupiranje u zahtjevu. Grupiranje u agregatnim funkcijama jezika upita

Grupiranje u zahtjevu.  Grupiranje u agregatnim funkcijama jezika upita

1C jezik upita je jedna od glavnih razlika između verzija 7.7 i 8. Jedna od najvažnijih tačaka u učenju 1C programiranja je jezik upita. U 1C 8.3 upiti su najmoćniji i najefikasniji alat za dobijanje podataka. Jezik upita vam omogućava da dobijete informacije iz baze podataka na prikladan način.

Sama sintaksa u velikoj mjeri podsjeća na klasični T-SQL, osim što u 1C, koristeći jezik upita, možete primati podatke samo pomoću konstrukcije Select. Jezik također podržava složenije konstrukcije, na primjer, (zahtjev unutar zahtjeva). Upiti u 1C 8 mogu se pisati i ćirilicom i latinicom.

U ovom članku pokušat ću govoriti o glavnim ključnim riječima u 1C jeziku upita:

  • izabrati
  • dozvoljeno
  • razne
  • express
  • prvo
  • za promjenu
  • značenje
  • tip vrijednosti (i REFERENCE operator)
  • izbor
  • group by
  • vlasništvo
  • ISNULL
  • Da NULL
  • priključci - desni, lijevi, unutrašnji, puni.

Kao i neke male trikove 1C jezika, pomoću kojih možete optimalno konstruirati tekst zahtjeva.

Za otklanjanje grešaka u upitima u sistemu 1C 8.2 obezbeđen je poseban alat - konzola za upite. Možete vidjeti opis i preuzeti ga koristeći link -.

Pogledajmo najvažnije i najzanimljivije operatore 1C jezika upita.

SELECT

U jeziku upita 1C Enterprise 8, svaki upit počinje ključnom riječi ODABIRATI. U jeziku 1C ne postoje konstrukcije UPDATE, DELETE, CREATE TABLE, INSERT; ove manipulacije se izvode u objektnoj tehnologiji. Njegova svrha je samo čitanje podataka.

Na primjer:

ODABIRATI
Current Directory.Name
OD
Imenik.Nomenklatura AS Trenutni imenik

Upit će vratiti tabelu s nazivima stavki.

Blizu strukture ODABIRATI možete pronaći ključne riječi ZA PROMJENU, DOZVOLJENO, VARIOUS, PRVO

DOZVOLJENO— bira samo zapise iz tabele na koje trenutni korisnik ima prava.

VARIOUS— znači da rezultat neće sadržavati duple linije.

IZBOR (SLUČAJ)

Programeri vrlo često potcjenjuju ovaj dizajn. Primjer njegove upotrebe:

Current Directory.Name,

WHEN Current Directory.Service THEN

"Usluga"

KRAJ KAKO PREGLEDATI Nomenklaturu

Imenik.Nomenklatura AS Trenutni imenik

Primjer će vratiti tekstualnu vrijednost u polju “Tip stavke” – “Proizvod” ili “Usluga”.

GDJE

Dizajn 1C jezika upita, koji vam omogućava da nametnete odabir na primljene podatke. Imajte na umu da sistem prima sve podatke sa servera, a tek onda se bira na osnovu ovog parametra.

ODABIRATI
Imenik.Naziv
OD
Trenutni imenik.Nomenklatura AS Trenutni imenik
WHERE CurrentDirectory.Service = TRUE

U primjeru biramo zapise za koje je vrijednost atributa “Service” postavljena na “True”. U ovom primjeru mogli bismo proći sa sljedećim uvjetom:

"GDJE JE SERVIS"

U suštini, biramo redove u kojima je izraz nakon ključne riječi jednak "True".

Možete koristiti direktne uslove u izrazima:

GDJE kod = "005215"

Koristeći operator “VALUE()” u uvjetima, koristite pristup unaprijed definiranim elementima i enumeracijama u 1C zahtjevu:

WHERE Vrsta stavke = Vrijednost(Enumeracija.Vrste predmeta.Proizvod)

Vremenske vrijednosti se mogu specificirati na sljedeći način:

GDJE Datum prijema > DATETIME(2012,01,01):

Najčešće su uslovi navedeni kao parametri koji se prosleđuju zahtevu:

Nabavite 267 video lekcija na 1C besplatno:

WHERE NomenclatureGroup= &NomenklaturnaGrupa

Uslov se može nametnuti tipu atributa ako je kompozitnog tipa:

Ako trebate ograničiti odabir sa liste vrijednosti ili niza, možete učiniti sljedeće:

GDJE je Registar akumulacije Registar B (&Lista dokumenata za odabir)

Stanje takođe može biti složeno, a sastoji se od nekoliko uslova:

GDJE Datum prijema > DATETIME(2012,01,01) AND NomenclatureGroup= &NomenclatureGrupa A NE usluga

GROUP BY

Dizajn 1C 8.2 jezika upita koji se koristi za grupisanje rezultata.

Na primjer:

ODABIRATI
Prijem robe i usluga Roba.
SUM(Prijem robeUslugeRobe.Količina) AS količina,
SUM(Prijem robeUslugeRobe.Iznos) KAO iznos
OD
Dokument Prijem robe i usluga Roba KAKO Prijem robe i usluga Roba

GROUP BY
Prijem robeUslugeRobe.Robe

Ovaj zahtjev će sumirati sve primitke po količini i količini po artiklima.

Osim ključne riječi SUMA Možete koristiti druge agregatne funkcije: KOLIČINA, BROJ RAZLIČITIH, MAKSIMALNO, MINIMUM, PROSJEČNO.

HAVING

Dizajn koji se često zaboravlja, ali je vrlo važan i koristan. Omogućava vam da odredite odabir u obliku agregatne funkcije, što se ne može učiniti u dizajnu GDJE.

Primjer korištenja HAVING-a u 1C zahtjevu:

ODABIRATI
Prijem robe i usluga Roba.
SUM(Prijem robeUslugeRobe.Količina) AS količina,
SUM(Prijem robeUslugeRobe.Iznos) KAO iznos
OD
Dokument Prijem robe i usluga Roba KAKO Prijem robe i usluga Roba

GROUP BY
Prijem robe i usluga Roba

SUM(Prijem robeUslugeRobe.Količina) > 5

Tako ćemo odabrati broj pristiglih proizvoda više od 5 komada.

ZNAČENJE()

Na primjer:

WHERE Bank = Vrijednost (Directory.Banks.EmptyLink)

WHERE Vrsta nomenklature = Vrijednost(Imenik.Vrste nomenklature.Proizvod)

WHERE Vrsta stavke = Vrijednost (Enumeration.Tipovi stavki.Usluga)

TYPE na zahtjev

Tip podataka se može provjeriti korištenjem funkcija TYPE() i VALUETYPE() ili korištenjem logičkog REFERENCE operatora.

EXPRESS()

Operator Express u 1C upitima koristi se za pretvaranje tipova podataka.

sintaksa: EXPRESS(<Выражение>KAKO<Тип значения>)

Koristeći ga, možete konvertirati vrijednosti niza u datum ili referentne vrijednosti u nizove podataka i tako dalje.

U praktičnim primenama, Express() operator se vrlo često koristi za konvertovanje polja neograničene dužine, jer polja neograničene dužine ne mogu da se biraju, grupišu itd. Ako se takva polja ne konvertuju, dobićete grešku Ne možete porediti polja neograničene dužine i polja nekompatibilnih tipova.

ODABIRATI
ContactInformation.Object,
EXPRESS(ContactInfo.View AS ROW(150)) KAO Pogled
OD
Registar informacija Kontakt informacije KAKO Kontakt informacije

GROUP BY
EXPRESS(ContactInfo.Representation AS ROW(150)),
ContactInformation.Object

ISNULL (ISNULL)

Prilično korisna funkcija 1C jezika upita koja provjerava vrijednost u zapisu i da li je jednaka NULL, To vam omogućava da ga zamijenite svojom vrijednošću. Najčešće se koristi pri dobijanju virtuelnih tabela stanja i prometa radi sakrivanja NULL i stavite čistu 0 (nula).

ISNULL(predmjesečni porezi. Primijenjena FSS beneficija, 0)

Takva funkcija 1C jezika upita ISNULL vratit će nulu ako nema vrijednosti, što će izbjeći grešku.

PRIDRUŽITE SE

Postoje 4 vrste veza: LIJEVO, PRAVO, KOMPLETAN, UNUTRAŠNJI.

LIJEVI i DESNI PRIKLJUČAK

Spojevi se koriste za povezivanje dvije tabele na osnovu specifičnog uslova. Feature when LEFT JOIN je da uzimamo prvu specificiranu tabelu u celini i uslovno vezujemo drugu tabelu. Polja druge tabele koja ne mogu biti vezana uslovom se popunjavaju vrednošću NULL.

Primjer lijevog pridruživanja u 1C zahtjevu:

Vratiće celu tabelu i popuniti polje „Banka“ samo na onim mestima gde je ispunjen uslov „Counterparties.Name = Banks.Name“. Ako uslov nije ispunjen, polje Banka će biti postavljeno na NULL.

DESNI JOIN na jeziku 1C 8.3 apsolutno slicno LIJEVA veza, sa izuzetkom jedne razlike: u PRAVO PRIKLJUČIVANJA"Glavna" tabela je druga, a ne prva.

FULL CONNECTION

FULL CONNECTION razlikuje se od lijevog i desnog po tome što prikazuje sve zapise iz dvije tabele i povezuje samo one koje može povezati po uslovu.

Na primjer:

FULL CONNECTION
Imenik.Banke KAKO Banke

BY

Jezik upita će u potpunosti vratiti obje tabele samo ako je ispunjen uslov za spajanje zapisa. Za razliku od lijevog/desnog spajanja, moguće je da se NULL pojavi u dva polja.

INNER JOIN

INNER JOIN razlikuje se od punog po tome što prikazuje samo one zapise koji se mogu povezati prema datom uslovu.

Na primjer:

OD
Imenik. Counterparties AS Klijenti

INNER JOIN
Imenik.Banke KAKO Banke

BY
Clients.Name = Banks.Name

Ovaj upit će vratiti samo redove u kojima banka i druga strana imaju isto ime.

Zaključak

Ovo je samo mali dio sintakse iz 1C 8 jezika upita; u budućnosti ću pokušati detaljnije razmotriti neke točke, pokazati i još mnogo toga!

Grupacije u 1C upitima se koriste kada je potrebno skupiti tablicu dobivenu iz izvora podataka bilo kojom kolonom ( grupisanje kolone) i sa vrijednostima druge kolone ( stupac koji se može grupirati) izvršiti neke matematičke ili statističke operacije, na primjer, izračunati zbir.

Nemoguće je proširiti grupisanje nakon izvršenja upita i saznati koji su redovi uključeni u njega nakon izvršavanja upita (za razliku od korištenja Rezultati).

Kada koristite grupisanje, sve kolone u upitu se dijele na grupisane i grupisane, ne bi trebalo postojati kolona koja ne pripada nekoj od kategorija. Istovremeno, možda neće biti grupisanih kolona ako su sve kolone grupisane, i obrnuto, možda neće biti grupisanih kolona ako su svi grupisani.

Grupiranje kolona je naznačeno u posebnom odjeljku upita koji počinje frazom GROUP BY. Kolone koje treba grupirati su naznačene kroz agregatne funkcije u odjeljku ODABIRATI.

Postoji 6 vrsta agregatnih funkcija koje se koriste u grupisanju:

  1. SUMA— zbraja vrijednosti grupisanog stupca, odnosi se samo na numeričke vrijednosti.
  2. PROSJEČAN - Izračunava aritmetičku sredinu vrijednosti grupisanog stupca, primjenjivo samo na numeričke vrijednosti.
  3. MAKSIMALNO — može se koristiti za bilo koju vrstu vrijednosti grupisane kolone i vraća maksimalnu vrijednost svih grupisanih kolona. Ako vrijednosti nisu numeričke, onda se pri sortiranju u rastućem redoslijedu vraća posljednja.
  4. MINIMALNO - može se koristiti za bilo koju vrstu vrijednosti grupisane kolone i vraća minimalnu vrijednost svih grupisanih kolona. Ako vrijednosti nisu numeričke, onda se prva vraća prilikom sortiranja uzlaznim redoslijedom.
  5. KOLIČINA— vraća broj vrijednosti u grupisanoj koloni, može se koristiti za bilo koju vrstu vrijednosti. Vrijednosti tipa se ne uzimaju u obzir NULL.
  6. KOLIČINA RAZLIČITA – vraća broj različitih vrijednosti u grupisanoj koloni, može se koristiti za bilo koju vrstu vrijednosti. Vrijednosti tipa se ne uzimaju u obzir NULL.

Polja upita na koja se primjenjuju agregatne funkcije moraju se dodijeliti aliasi.

Pogledajmo upotrebu grupiranja u 1C upitima koristeći primjere.

Izvor podataka će biti tabela kupovine proizvoda zalihe, koji odražava operacije isporuke robe (svaka isporuka u posebnom redu):

Zadatak 1.

Saznajte koji su dobavljači isporučili robu.

Rješenje: Jedno rješenje bi moglo biti odabir jedne kolone Provajder i grupisanje prema tome.

Zahtjev. Tekst= „IZABIR
Supplies.Supplier
OD
Zalihe KAKO Zalihe
GROUP BY
Supplies.Supplier"
;

Zadatak 2.

Saznajte ukupnu količinu svake vrste isporučenog proizvoda.

Rješenje: Potrebno je odabrati dvije kolone: ​​proizvod i količinu, grupirati rezultat po polju proizvod, korištenjem agregatne funkcije Suma.

Zahtjev. Tekst= „IZABIR
Zalihe.Proizvod,
AMOUNT (Zalihe. Količina) AS Količina
OD
Zalihe KAKO Zalihe
GROUP BY
Zalihe.Proizvod"
;

Zadatak 3.

Odredite koliko jedinica u prosjeku isporučuje svaki dobavljač.

Rješenje: Potrebno je odabrati dvije kolone: ​​dobavljač i količinu, grupisati rezultat po polju Provajder, korištenjem agregatne funkcije Prosjek.

Zahtjev. Tekst= „IZABIR
Supplies.Supplier,
PROSJEČAN (zalihe. Količina) AS količina
OD
Zalihe KAKO Zalihe
GROUP BY
Supplies.Supplier"
;

U ovom članku želimo o svemu razgovarati s vama Funkcije 1C jezika upita, i konstrukcije jezika upita. Koja je razlika između funkcije i dizajna? Funkcija se poziva sa zagradama i mogućim parametrima u njima, a konstrukcija se piše bez zagrada. Bez sumnje sve strukture i funkcije 1C jezika upita učiniti proces prikupljanja podataka fleksibilnim i multifunkcionalnim. Ove funkcije i konstrukcije primjenjuju se na polja upita, a neke se primjenjuju i na uvjete.

1C funkcije jezika upita

Jer jasan opis Funkcije 1C jezika upita je mnogo rjeđi od opisa struktura, odlučili smo da počnemo gledati funkcije. Sada pogledajmo svaki posebno, opisujući njegovu svrhu, sintaksu i primjer upotrebe, dakle:

1. Funkcija DATUM VRIJEME- ova funkcija kreira konstantno polje tipa "Datum".

sintaksa: DATUM VRIJEME(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Primjer upotrebe:

2. DATUM DIFFERENCE funkcija- vraća razliku između dva datuma u jednoj od dimenzija (godina, mjesec, dan, sat, minuta, sekunda). Mjerenje se prenosi kao parametar.

sintaksa: DATUM RAZLIKA(<Дата1>, <Дата2>, <Тип>)

Primjer upotrebe:

Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Broj dana";

3. Funkcija VALUE- postavlja konstantno polje sa unapred definisanim zapisom iz baze podataka; takođe možete dobiti prazan link bilo koje vrste.

Sintaksa: VALUE(<Имя>)

Primjer upotrebe:

Request.Text = "SELECT //predefinirani element | VALUE(Directory.Currencies.Dollar) AS Dollar, //prazna veza | VALUE(Document.Prijem robe i usluga.EmptyLink) AS Potvrda, //transfer vrijednost | VALUE(Transfer . Pravni pojedinac. Pojedinac) AS Pojedinac, //predefinisani račun | VRIJEDNOST(Kontni plan. Samonosivi. Materijali) AS Račun_10" ;

4. SELECT funkcija- pred nama je analog konstrukcije IF, koji se koristi u kodu, samo se ovaj koristi u 1C upitima.

sintaksa: IZBOR KADA<Выражение>ONDA<Выражение>U suprotnom<Выражение>KRAJ

Primjer upotrebe:

Request.Text = //ako je iznos veći od 7500, tada bi trebao postojati popust od 300 rubalja, //pa ako se uvjet aktivira onda funkcija //vraća Sum - 300 //u suprotnom zahtjev će vratiti jednostavno Sum "SELECT | SELECT | WHEN TCReceipts.Iznos > 7500 | THEN TCReceipts.Iznos - 300 | ELSE TCReceipts.Iznos | END AS IznosWithDiscount |FROM | Dokument.Prijem robeUsluge.Roba AS TCReceipts";

5. EXPRESS funkcija- omogućava vam da izrazite konstantno polje sa određenim tipom.

sintaksa: EXPRESS(Ime polja AS Ime vrste)

Primjer upotrebe:

Query.Text = "IZABIR RAZLIČITI | Sales.Registrar.Broj, | SELECT | KADA Sales.Registrar LINK Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar LINK Document.Im. THEN EXPRESS(Sales.Registrar AS Dokument.Implementacija) | KRAJ | ... | KRAJ AS Broj | FROM | Registar Akumulacije.Kupovine AS Kupovine";

Postoji li druga opcija za korištenje funkcije EXPRESS u poljima mješovitih tipova, gdje se pojavljuju? Najjednostavniji primjer je “Registar” za bilo koji registar. Pa zašto bismo mogli da kvalifikujemo tip u registratoru? Razmotrimo situaciju kada iz registratora odaberemo polje "Broj", iz koje tabele će se odabrati broj? Tačan odgovor svih! Stoga, da bi naš upit brzo funkcionirao, trebali bismo specificirati eksplicitni tip koristeći funkciju EXPRESS

Primjer upotrebe:

Query.Text = "SELECT | EXPRESS(Nomenklatura.Komentar AS Linija(300)) KAO Komentar, | EXPRESS(Nomenklatura.Zbroj AS Broj(15,2)) AS Zbroj |FROM | Imenik.Nomenklatura AS Nomenklatura";

6. ISNULL funkcija(alternativno pravopis ISNULL) - ako je polje tipa NULL, tada se zamjenjuje drugim parametrom funkcije.

sintaksa: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Primjer upotrebe:

Također imajte na umu da je preporučljivo UVIJEK zamijeniti tip NULL nekom vrijednošću, jer poređenje s tipom NULL uvijek vraća FALSE čak i ako usporedite NULL sa NULL. Najčešće se NULL vrijednosti formiraju kao rezultat spajanja tablica (sve vrste spajanja osim internih).

Query.Text = //Odaberi cijelu stavku i njena stanja //ako nema stanja u nekoj stavci, tada će postojati polje //NULL koje će biti zamijenjeno vrijednošću 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Ostatak | FROM | Imenik.Nomenklatura AS Br. | LIJEVA VEZA Registrirajte Akumulacije. GoodsInWarehouses. Remainings AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. (GoodsInWarehousesRemains).

7. REPRESENTATION funkcija- omogućava vam da dobijete prikaz polja zahtjeva.

sintaksa: PERFORMANSE(<НаименованиеПоля>)

Primjer upotrebe:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenklatura, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM.AccumulationRemainRemain.Remaining.FROM.RemainingRemains.Remaining.FROM.RemainingRemainRemain.Register

Konstrukcije u 1C jeziku upita

Gore smo razgovarali s vama Funkcije 1C jezika upita, sada je vrijeme za razmatranje konstrukcije u 1C jeziku upita, nisu ništa manje važni i korisni, hajde da počnemo.

1. Građevinski LINK- je logički operator za provjeru referentnog tipa. Najčešće se susreće prilikom provjere polja složenog tipa u odnosu na određeni tip. sintaksa: VEZA<Имя таблицы>

Primjer upotrebe:

Request.Text = //ako je tip vrijednosti zapisivača dokument Prijem, //onda će upit vratiti "Prijem robe", u suprotnom "Prodaja robe" "SELECT | SELECT | WHEN Remainings.Registrar LINK Dokument.Prijem robe i Usluge | ONDA ""Prijem"" | OSTALO ""Potrošnja"" | KRAJ KAO Vrsta kretanja | IZ | Registar akumulacije. Preostali proizvodi u skladištima KAO ostaci" ;

2. Design BETWEEN- ovaj operator provjerava da li je vrijednost unutar navedenog raspona.

sintaksa: IZMEĐU<Выражение>I<Выражение>

Primjer upotrebe:

Request.Text = //dobijemo cijelu nomenklaturu čiji je kod u rasponu od 1 do 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code IZMEĐU 1 I 100" ;

3. HIJERARHIJA konstrukcije B i B- provjeriti da li je vrijednost u prenesenoj listi (nizovi, tablice vrijednosti itd. mogu se prenijeti kao lista). Operator IN HIERARCHY vam omogućava da vidite hijerarhiju (primjer korištenja kontnog plana).

sintaksa: IN(<СписокЗначений>), U HIJERARHIJI(<СписокЗначений>)

Primjer upotrebe:

Request.Text = //odaberite sve podračune računa "ODABIR | Samonosivi. Veza KAO račun | FROM | Kontni plan. Samonosivi AS Samonosivi | GDJE | Samonosivi. Veza U HIJERARHIJSKOJ VRIJEDNOSTI (Grafikon Računi. Samonosivi. Roba)";

4. Dizajn SLIČAN- Ova funkcija nam omogućava da uporedimo string sa uzorkom niza.

sintaksa: LIKE "<ТекстШаблона>"

Opcije uzorka redova:

% - niz koji sadrži bilo koji broj proizvoljnih znakova.

Jedan proizvoljan karakter.

[...] - bilo koji pojedinačni znak ili niz znakova naveden u uglastim zagradama. Nabrajanje može specificirati opsege, na primjer a-z, što znači proizvoljan znak uključen u raspon, uključujući krajeve raspona.

[^...] - bilo koji pojedinačni znak ili niz znakova naveden u uglastim zagradama osim onih navedenih iza znaka negacije.

Primjer upotrebe:

Query.Text = //pronađi cijelu nomenklaturu koja sadrži korijen TABUR i počinje //s malim ili velikim slovom t "SELECT | Nomenclature. Link | FROM | Directory. Nomenklatura KAO Nomenklatura | WHERE | Proizvodi. Naziv LIKE "" [Tt ]abur%""" ;

5. Dizajn DOZVOLJEN- ovaj operater vam omogućava da izaberete samo one zapise iz baze podataka za koje pozivalac ima dozvolu čitanja. Ova prava su konfigurisana na nivou zapisa (RLS).

sintaksa: ALOWED se piše iza ključne riječi SELECT

Primjer upotrebe:

Request.Text = "ODABIR DOZVOLJENO | Counterparts. Link | FROM | Directory. Counterparties AS Counterparts";

6. Dizajn VARIOUS- omogućava vam da odaberete zapise u kojima nema dupliranih zapisa.

sintaksa: VARIOUS se piše iza ključne riječi SELECT

Primjer upotrebe:

Request.Text = //odabire zapise na koje čitač ima prava "IZABIR RAZLIČITIH | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

Također, konstrukcija VARIOUS se može koristiti sa operatorom ALLOWED i drugim operatorima.

Primjer upotrebe:

Request.Text = //odabire različite zapise na koje čitalac ima prava "ODABIR DOZVOLJENIH RAZLIČITIH | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties";

7. Dizajn FIRST- bira broj zapisa navedenih u parametru iz rezultata upita.

Sintaksa: FIRST<число>

Primjer upotrebe:

Request.Text = //odaberite prva 4 CCD broja iz direktorijuma "IZABIR PRVI 4 | CCD brojevi. Veza | IZ | Direktorijuma. CCD brojevi KAO CCD brojevi";

8. Dizajn ZA PROMJENU- omogućava zaključavanje tabele, radi samo u transakcijama (relevantno samo za automatska zaključavanja).

sintaksa: ZA PROMJENU<НаименованиеТаблицы>

Primjer upotrebe:

Query.Text = "SELECT | Slobodni ostaci ostataka. Nomenklatura, | besplatni ostaci ostataka. Skladište, | besplatni ostaci ostataka. Ostalo na zalihama | FROM | Registar akumulacija. Slobodni ostaci. Ostaci KAO slobodni ostaci ostataka. Registar akumulacija | Registar akumulacija | . Slobodni ostaci. Ostaci";

9. Dizajn ORDER BY- organizira podatke po određenom polju. Ako je polje veza, onda prilikom postavljanja zastavice AUTO ORDER Sortiranje će se odvijati prema predstavljanju veze; ako je zastavica isključena, onda se veze sortiraju prema senioritetu adrese veze u memoriji.

sintaksa: SORT BY<НаименованиеПоля>AUTO ORDER

Primjer upotrebe:

Query.Text = "SELECT | Besplatni ostaci ostataka. Nomenklatura AS nomenklatura, | besplatni ostaci ostataka. Skladište AS skladište, | besplatni ostaci ostataka. Na zalihi Preostalo | FROM | Registrirajte akumulacije. Slobodni ostaci. Preostali KAO slobodni preostali ORDER Preostaje | | Nomenklatura | AUTO ORDER VANIE";

10. Dizajn GROUP BY- koristi se za grupisanje nizova upita prema određenim poljima. Numerička polja moraju se koristiti sa bilo kojom agregatnom funkcijom.

sintaksa: GROUP BY<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Primjer upotrebe:

Query.Text = "SELECT | ItemsInWarehouses.Nomenklatura KAO Nomenklatura, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) KAO INSTOCK |FROM | RegisterAccumulations.ItemsInWarehouses AS ItemsInWarehouses.Warehouses |A ItemsInWarehouses.A.W.Warehouses | kuća ah.Skladište" ;

11. Dizajn HAVING- omogućava vam da primijenite agregatnu funkciju na uvjet odabira podataka, slično konstrukciji WHERE.

sintaksa: HAVING<агрегатная функция с условием>

Primjer upotrebe:

Query.Text = //odabira grupisane zapise u kojima je polje InStock veće od 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) KAO INSTOCK |FROM | RegisterAccumulations.ItemsSInSi | GROUP BY | ProductsInWarehouses.Nomenclature, | ProductsInWarehouses.Warehouse | |DOSTUPNO | IZNOS(ProductsInWarehouses.InStock) > 3" ;

12. Građevinski INDEX BY- koristi se za indeksiranje polja upita. Upit sa indeksiranjem traje duže da se završi, ali ubrzava pretragu kroz indeksirana polja. Može se koristiti samo u virtualnim tablicama.

sintaksa: INDEX BY<Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Dizajn WHERE- omogućava vam da nametnete uslov na bilo koja polja za odabir. Rezultat će uključivati ​​samo zapise koji zadovoljavaju uvjet.

sintaksa: GDJE<Условие1 ОператорЛогСоединения УсловиеN>

Primjer upotrebe:

Query.Text = //svi zapisi sa CompensationRemaining su odabrani<>0 i //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |FROM.RPORemains.CompensationRemains |FROM.Registar Compensation. Ostaci | WHERE |CompensationRPORemaining.CompensationRemaining<>0 | I CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. REZULTATI dizajna... OPĆE- koristi se za izračunavanje ukupnih iznosa; dizajn specificira polja po kojima će se ukupni iznosi izračunati i agregatne funkcije se primjenjuju na ukupna polja. Kada se koriste zbrojevi za svako polje nakon konstrukcije TOTAL, podaci se grupišu. Postoji opcioni GENERAL konstrukt; njegova upotreba takođe obezbeđuje dodatno grupisanje. U nastavku ćete vidjeti primjer rezultata zahtjeva.

sintaksa: REZULTATI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>BY<ОБЩИЕ> <Поле1, ... , ПолеN>

Primjer upotrebe:

Request.Text = "SELECT | Kalkulacije. Ugovor sa drugom stranom. Vrsta ugovora AS Vrsta ugovora, | Izračuni. Ugovor sa drugom stranom AS Ugovor, | Izračuni. Druga strana, | Izračuni. Iznos međusobne namirnice kao Stanje | OD. Registar akumulacija. Poravnanje SA drugim ugovornim stranama. Stanja KAO kalkulacije | UKUPNO | IZNOS (Stanje) |Softver | OPĆE, | Vrsta ugovora";

Na slici su prikazane grupe koje su formirane tokom izvršenja zahteva, gornja se odnosi na OPŠTI deo, a druga na polje Vrsta ugovora sa drugom stranom.

Ovaj mehanizam upita se koristi za izračunavanje indikatora za odabrana polja grupisanja.

Na primjer, za rješavanje problema: odredite iznos svih prodaja druge ugovorne strane za određeni period, maksimalni ili prosječni račun.

Brzi prolaz

Osnovna sintaksa:

ODABIRATI<ГруппировочныеПоля>, <СУММА(<РасчетноеПоле>)>
OD<Источник>
GROUP BY
<ГруппировочныеПоля>

Ispostavilo se da su u direktivi GROUP BY sva polja iz SELECT duplicirana, osim onih za koja se vrši proračun. Prilikom dodavanja polja u konstruktor, to se radi automatski, ako ga sami ručno pratite, inače će doći do greške: „Polje nije uključeno u grupu.“

Napominjem da nije potrebno dodavati primitivne vrijednosti (broj, datum, string) ili detalje veza koje su već prisutne u grupisanju.

Možda uopće neće biti agregatnih funkcija, u kom slučaju će upit raditi kao da koristi SELECT DISTINCT.

//Ovaj zahtjev će primiti broj jedinstvenih artikala koji su prošli kroz svako skladište u sistemu
ODABIRATI
Preostale zalihe. Skladište,
KOLIČINA (OSTAJE RAZLIČITI INVENTAR. Nomenklatura) KAO Nomenklatura,
1,
DATETIME(2017,1,12),
Preostale zalihe.Skladište.Naziv
OD
Registar akumulacija Stanja zaliha AS Stanja zaliha

GROUP BY
Preostale zalihe.Skladište

Funkcije grupisanja (agregat)

  • SUMA (<Поле>)
  • KOLIČINA(<Поле>)
  • KOLIČINA (RAZLIČITA<Поле>)
  • MAKSIMALNO (<Поле>)
  • MINIMUM (<Поле>)
  • PROSJEČAN(<Поле>)

Druge opcije grupisanja

Dozvoljeno je korištenje matematičkih operatora nad funkcijama grupiranja (+,*,/,-), kao i konstrukcija SELECT kako na vrhu jedinice tako i iznutra (ovisno o potrebama)

ODABIRATI
,
SUM(Stanje zalihaPromet.SumPromet) AS IznosPromet,
SUM(Stanje zalihaPromet.KoličinaPromet) AS KoličinaPromet,
IZBOR
WHEN SUM(Stanje zalihaPromet.Promet količine) = 0
ONDA 0
ELSE SUM(Stanje zalihaPromet.IznosPromet) / SUM(Stanje zalihaPromet.KoličinaPromet)
KRAJ KAO prosječna cijena
OD

GROUP BY
Stanja zalihaPromet.Nomenklatura

Primjer zahtjeva bez funkcija:
ODABIRATI
Stanja zalihaPromet.Nomenklatura
OD
RegisterAkumulacije.Stanja zaliha.Promet AS Stanja zalihaPromet

GROUP BY
Stanja zalihaPromet.Nomenklatura

Možete koristiti agregate preko tabela koje se pridružuju, ali se preporučuje korištenje funkcije IsNULL na vrhu

ODABIRATI
ReferenceNomenclature.Link,
ISNULL(SUM(Stanje zalihaPromet.IznosPromet), 0) KAO iznos
OD
Imenik.Nomenklatura AS RefNomenklatura
LIJEVA VEZA Registar Akumulacije.Stanja zaliha.Promet AS Stanja zalihaPromet
Softver (Stanje zalihaObrt.Nomenklatura = SprNomenklatura.Link)

GROUP BY

RefNomenclature.Link

Grupiranje u dizajneru upita

Proizvedeno na istoimenoj kartici.

  • Od dostupnih polja biraju se grupna polja, kao i polja koja se mogu sabirati (za svako od njih se bira funkcija sumiranja).
  • U sredini se nalaze dugmad za dodavanje ili ih možete prevući i ispustiti mišem
  • Konstruktor obično bira samu funkciju (obavezno provjerite njene akcije)

Pretpostavimo da u našim skladištima imamo sljedeće proizvode:

Odjeljak za grupisanje je deklariran ključnom riječi GROUP BY. Zašto je potrebno grupisanje u upitu? Apsolutno u pravu, za kombinovanje identičnih polja tabele u grupu i dobijanje zbirnih rezultata za ostalo. Grupisanje sažima slična polja upita u jedno, čime se smanjuje broj rezultujućih zapisa. Odmah da rezervišem: ako se u zahtevu koristi grupisanje, sva polja treba podeliti u dve kategorije: ona po kojima grupišemo i ona koja su grupisana. Dozvolite mi da objasnim na primjeru, recimo da želimo saznati koliko robe općenito imamo, bez uzimanja u obzir skladišta, tada ćemo napisati sljedeći kod zahtjeva:

Request.Text = "
|ODABIR
| Proizvodi.Proizvod,
| SUM(stavke.Količina) AS količina
|OD
|
|GROUP BY
| Proizvodi.Proizvod";

U ovom slučaju, Proizvod je polje po kojem se vrši grupisanje, a Količina je grupisano polje. SUM je agregatna funkcija, koja ukazuje upitu da treba sabrati sve podatke o broju identičnih proizvoda. Rezultat ovog upita će biti tabela poput:

Agregatne funkcije

Na grupisana polja mora se primijeniti agregatna funkcija, ovo je opcionalno ZBIR, kao i MAKSIMALNO, MINIMALNO, PROSJEČNO, KOLIČINA, BROJ RAZLIČITIH. Pogledajmo pobliže djelovanje svakog od njih.

SUMA- odnosi se samo na numerička polja, dodaje brojeve koji su mu proslijeđeni. Njegov rezultat je prikazan na gornjoj slici.

PROSJEČNO- odnosi se samo na numerička polja, izračunava prosjek - zbir proslijeđenih parametara / broj parametara:

MAKSIMALNO- može se koristiti za bilo koja polja, prima maksimum proslijeđenih parametara. Recimo da tekst zahtjeva izgleda ovako:

Request.Text = "
|ODABIR
| Proizvodi.Proizvod,
| MAX(Proizvodi.Skladište) AS skladište,
| MAKSIMALNO(stavke.Količina) AS količina
|OD
| Directory.Products AS Proizvodi
|GROUP BY
| Proizvodi.Proizvod";

One. Ponovo imamo jedno polje za grupisanje Proizvod i dva polja za grupisanje: Skladište i Količina. Rezultat ovog upita će izgledati ovako:

MINIMALNO - može se koristiti za bilo koja polja, prima minimum proslijeđenih parametara:

KOLIČINA- može se koristiti za bilo koja polja, dobiva broj proslijeđenih parametara:

BROJ RAZLIČITIH- može se koristiti za bilo koja polja, dobiva broj različitih parametara. One. ako je funkcija proslijeđena parametri (1,1,2,3,3,3,4,4,4,4,4,5), onda će se vratiti 5 . Funkcija COUNT bi vratila 12. Upit koji koristi funkciju COUNT OF DIFFERENT bi izgledao ovako:

Request.Text = "
|ODABIR
| Proizvodi.Proizvod,
| KOLIČINA (RAZLIČITI PROIZVODI. SKLADIŠTE) KAO SKLADIŠTE,
| KOLIČINA (RAZLIČITI predmeti. Količina) KAO količina
|OD
| Directory.Products AS Proizvodi
|GROUP BY
| Proizvodi.Proizvod";

rezultat:

Grupirajmo po dva polja: Proizvod i Skladište:

Request.Text = "
|ODABIR
| Proizvodi.Proizvod,
| Products.Warehouse AS Skladište,
| <АГРЕГАТНАЯ ФУНКЦИЯ>(Artikli. Količina) AS količina
|OD
| Directory.Products AS Proizvodi
|GROUP BY
| Proizvodi.Proizvod,
| Proizvodi.Skladište";

za različite agregatne funkcije rezultat će biti sljedeći:

Hajde da rezimiramo:

Ako se u zahtjevu koristi grupisanje, tada se sva polja moraju podijeliti na grupisana (koja će biti „sažeta“) i grupisana (kojima se vrši grupisanje – „sažeto“). Jedna od agregatnih funkcija mora se primijeniti na polja koja se grupišu, iako se funkcije kao što su SUM i AVERAGE mogu primijeniti samo na numerička polja.



top