/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Returnere antal af rækker berørt af quer~
Fra : mungoejerrie
Vist : 509 gange
100 point
Dato : 11-11-03 12:57

Jeg har følgende query :

SELECT
a.ParcelNumber,
b.GoodsDescription,
c.TimeStatus
FROM
TransFleet.dbo.CargoLine b,
TransFleet.dbo.OrderParcelNumbers a,
TransFleet.dbo.OrderStatus c
WHERE
b.OrderId = c.OrderId AND
a.OrderId = c.OrderId AND
c.TimeStatus>{ts '2003-09-01 00:00:00'} And c.TimeStatus<{ts '2003-09-02 00:00:00'} AND
b.GoodsDescription='afhenter'
GROUP BY a.ParcelNumber, b.GoodsDescription, c.TimeStatus

Den returnerer 6 rækker og jeg vil gerne have flettet en variabel ind som får talt disse rækker sammen.

Er der nogen som kan klare det ?

 
 
Kommentar
Fra : pmbruun


Dato : 11-11-03 13:24

Overskriften siger, at du vil tælle antallet af berørte rækker. Det gør du med count(*), altså:

SELECT count(*), ... from ...

I selve formuleringen snakker du om at tælle rækker sammen. Det lyder som om du vil addere et eller andet, hvilket gøres med funktionen sum. Jeg kan dog ikke lige se noget, som det ville være nyttigt at summere imellem dine kolonner.

Hvis det er noget mere specielt, du vil, må du lige formulere spørgsmålet lidt mere præcist.

Peter



Kommentar
Fra : mungoejerrie


Dato : 11-11-03 13:34

Hej Peter

Ja, jeg vil gerne have min query til at returnere det antal som matcher på mine kriterier ( i dette tilfælde 6 rows) og jeg har skam prøvet med en count(*), men den vil returne 1 for hver af de 6 rækker og det kan jeg ikke bruge.

Håber det giver mere mening.

Kommentar
Fra : pmbruun


Dato : 11-11-03 14:17

Du får 6 rækker, og i hver række skal der være en kolonne kaldet Count, og der står tallet 6 i dem allesammen. Er det rigtigt forstået?

Så er problemet, at din GROUP BY aggregering rammer count.

Jeg foreslår at du definerer et view (hvis din database understøtter views) således;

CREATE VIEW V AS
SELECT a.ParcelNumber, ...
FROM TransFleet.dbo.CargoLine b, ...
WHERE b.OrderId = c.OrderId AND ...
GROUP BY a.ParcelNumber, ...

hvor "..." betyder "alt det du skrev ovenfor". Nu kan du få den beskrevne effekt ved at skrive:

SELECT a.ParcelNumber, ..., (SELECT COUNT(*) FROM V) FROM V;

Det virker i hvert fald med Oracle. Hvis du er bekymret over, hvor hurtigt det går, kan du bruge et programeringssprog/stored procedures til at hente rækkerne, og så tælle dem der. Det er selvfølgelig også langt sværere - det koster noget at optimere.

Peter


Kommentar
Fra : mungoejerrie


Dato : 11-11-03 14:23

okay

jeg har faktisk i mellemtiden lavet en stored procedure som jeg da gerne vil have til at klare opgaven for mig

Den ser sådan ud:

USE TransFleet
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'usp_count_parcels' AND type = 'P')
DROP PROCEDURE usp_count_parcels
GO
CREATE PROCEDURE usp_count_parcels
   @time datetime,
   @description varchar(100)
AS

SELECT
a.ParcelNumber,
b.GoodsDescription,
c.TimeStatus
FROM
TransFleet.dbo.CargoLine b,
TransFleet.dbo.OrderParcelNumbers a,
TransFleet.dbo.OrderStatus c
WHERE
b.OrderId = c.OrderId AND
a.OrderId = c.OrderId AND
c.TimeStatus>@time AND c.TimeStatus<@time+1 AND
b.GoodsDescription = @description
GROUP BY a.ParcelNumber, b.GoodsDescription, c.TimeStatus

GO

"Du får 6 rækker, og i hver række skal der være en kolonne kaldet Count, og der står tallet 6 i dem allesammen. Er det rigtigt forstået?"
Nej min count skal summere alle mine rækker sammen.


Accepteret svar
Fra : pmbruun

Modtaget 100 point
Dato : 11-11-03 15:27

Det bliver mere og mere uklart, hvad det er du vil. Jeg forsøger i nedenstående at forgrene ud på de forskellige fortolkningsmuligheder, markeret med "********".

Jeg *har* skam talt alle rækkerne sammen - svaret er jo 6 siger du! Men du må vælge, hvor mange resultatrækker du ønsker. Hvis du vil have 6 rækker kan du ikke samtidig få 1. Enten 6 eller 1 fra samme query. Blæse eller have mel i munden.

********
Hvis du vil have 6 rækker, og samtidig vil have det totale antal rækker ud, så må det totale antal rækker (=6) altså nødvendigvis komme 6 gange. Det var den løsning jeg sendte.

********
Hvis du kun vil have een række, så er resten noget sludder, for så skriver du bare

SELECT COUNT(*) FROM ...

D.v.s. undlader at selectere alle de andre kolonner, som du jo i så fald ikke skal bruge til noget. Hvis du både vil have 6 rækker og een række, så *skal* du bruge to queries - eet som det du skriver og eet som kun har COUNT - som vist.

********
Eller også mener du, at der er forskel på antallet af rækker i dit resultat og antallet af underliggende (aggregerede) rækker. Det stemmer bare ikke med, at du siger, at count(*) giver 1 i alle rækker. Når du bruger GROUP BY skal COUNT(*) returnere antallet af aggregerede rækker under hver resultatrække. Nuvel, hvis dit summerede antal skal være større end 6, kan du bare tage COUNT(*) med i viewet, og lægge dem sammen med SUM:

CREATE VIEW V(number, descr, status, count) AS
SELECT a.ParcelNumber, ..., COUNT(*)
FROM ...

SELECT number, descr, status, (SELECT SUM(count) FROM V) FROM V;

Det vil altid give det rigtige tal.

Ad Stored Procedure:
Normalt vil det være ligegyldigt med performance af ovenstående med mindre du har dårlige indexes og mere end ca. 100.000 rækker.

Jeg kan se på syntaksen, at du bruger Sybase eller MSSQL. Det er et proprietært sprog, som jeg ikke lige kan huske detaljerne i længere. Hvis du vil tælle i den, skal du hente een række af gangen med en cursor og indføre en tæller. Det er ikke helt let.

Læs manualen eller send et nyt spørgsmål om brugen af stored procedures.


Godkendelse af svar
Fra : mungoejerrie


Dato : 11-11-03 15:40


Tak for svaret pmbruun.
                        

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste