[SQL] sorteer probleem

Pagina: 1
Acties:

  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
Ik zit met een probleem waar ik echt niet meer uitkom... hopelijk dat hier iemand me een handje kan helpen of iig een nieuw licht op de zaak op de zaak kan werpen.

Ik wil een overzicht van alle verschillende CallID's en deze CallID's moeten gesorteerd zijn op datum. Klinkt simpel denk je in eerste instantie, maar het probleem is dat CallID niet uniek is en in de tabel geen enkele unieke waarde is. De tabel mag ik niet aanpassen, dus dat is een gegeven. Als ik het statement maak, zoals het hieronder staat, dan werkt dit niet, omdat ik dan ActivityDate ook in de SELECT moet zetten. Doe ik dit echter, dan gaat het om unieke combinaties van CallID + ActivityDate en dat is dus niet de bedoeling. Ik wil de unieke CallID's gesorteerd op datum en dan moet er eigenlijk alleen gekeken worden naar de activityDate die het verste in het verleden is...

Hopelijk is het een beetje duidelijk geformuleerd en kan iemand een oplossing bedenken. Ik wacht met spanning :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT DISTINCT ChaseCalls.CallID 
FROM ChaseCalls , ChaseActivities
WHERE ChaseCalls.CallID = ChaseActivities.CallID
AND ServiceTypeCode = 'EURP'
AND ActivityCode = 'EWIP'
AND ActivityDate > 'yearFrom'
AND ChaseCalls.CallID NOT IN 
    (SELECT ChaseCalls.CallID
    FROM ChaseCalls , ChaseActivities
    WHERE ChaseCalls.CallID = ChaseActivities.CallID
    AND ServiceTypeCode = 'EURP'
    AND ActivityCode = 'EWIP'
    AND ActivityDate < 'yearFrom')
ORDER BY ActivityDate

"Imagination is more important than knowledge" - Albert Einstein


Verwijderd

Hoe kun je nou unieke callis's hebben als die niet uniek zijn!?!?!?

Maar wat is nou precies de bedoeling??

sit. 1

CallID Datum
1 1-1-2001
1 1-1-2002
2 1-1-2002
3 1-1-2002
4 1-1-1999
4 1-1-2001

Sit. 2

CallID
1
1
2
3
4
4

sit. 3
CallID Datum
1 1-1-2001
2 1-1-2002
3 1-1-2002
4 1-1-1999

sit. 4
CallID
1
2
3
4

Welke van de vier??

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Waarom moet je activitydate opnemen in de select om daarop te kunnen sorteren? Voor zover ik weet hoeft dat niet.

Overigens, uhm .. hoezo doe je een join op een niet uniek veld eigenlijk? (of heb ik nu verkeerd gelezen?!)

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 20:48

BCC

Volgens mij kun je die query ook een heel eind optimaliseren (8>

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
Dit is hetgeen wat ik zou willen krijgen:
code:
1
2
3
4
5
CallID  ActivityDate
12345   2002-01-01 00:00:00
45215   2002-01-02 12:00:00
34256   2002-02-08 13:00:00
42621   2002-04-15 09:00:00

Probleem is echter dit helaas ook voorkomt:
code:
1
2
3
4
CallID  ActivityDate
12345   2002-01-01 00:00:00
12345   2002-01-02 00:00:00
12345   2002-01-03 00:00:00

Ik wil dus een lijst terugkrijgen met enkel alleen CallID's die gesorteerd is op datum en indien er CallID's zijn met meerdere ActivityDates moet de eerste gekozen worden (degene die het verste weg in het verleden ligt).

"Imagination is more important than knowledge" - Albert Einstein


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
min (activitydate) group by callid .. ?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Ten eerste: geef je datamodel eens erbij.
Ten tweede: alias je tabellen eens en zet die alias voor de kolomnamen.
Ten derde: Je subselect lijkt overbodig omdat je eerst alles pakt wat een activitydate heeft na een bepaald jaar en dan zeg je in de subselect dat het niet voor datzalfde jaar mag liggen. Kan je iets meer semantische uitleg geven van je statement.
edit:
[quote]
Op woensdag 24 april 2002 15:31 schreef Dash2in1 het volgende:
min (activitydate) group by callid .. ?
[/quote]

Yep!

Verwijderd

Als je niet uit een Query komt, is het altijd nuttig om zo klein mogelijk te beginnen. Probeer eerst een query te maken van je ID's waarbij die ID's maar één keer voorkomen (tip: werk met ditinct).

Vervolgens ga je een query maken die gesorteerd is op datum. Als laatste probeer je deze twee query's te combineren... (bijv. met een 'één op één' relatie)

Bij mij werkt het altijd het beste om het probleem in kleine stukjes te hakken, probeer het ook eens...

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Probleemreductie aanpak snap ik, maar de oplossing met een min(date) is toch echt het beste.

  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
CREATE TABLE [dbo].[ChaseActivities] (
    [CallID] [varchar] (15) NOT NULL ,
    [ActivitySeq] [tinyint] NOT NULL ,
    [ActivityETA] [real] NULL ,
    [ActivityCode] [varchar] (15) NOT NULL ,
    [ActivityOwnerCode] [varchar] (10) NOT NULL ,
    [ActivityDate] [smalldatetime] NULL ,
    [ActivityComment] [text] NULL ,
    [ActivityETD] [smalldatetime] NULL ,
    [ActivityAWB] [varchar] (20) NULL ,
    [ActivityOpen] [tinyint] NULL ,
    [ActivityClosedate] [datetime] NULL ,
    [ActivityEscalationDate] [datetime] NULL )

CREATE TABLE [dbo].[ChaseCalls] (
    [CallID] [varchar] (15) NOT NULL ,
    [CallCode] [varchar] (3) NULL ,
    [ServiceTypeCode] [char] (10) NULL ,
    [CurrentStatusCode] [char] (10) NULL ,
    [CurrentOwnerCode] [varchar] (10) NULL ,
    [CAgentId] [varchar] (50) NULL ,
    [ProductSerialNumber] [varchar] (30) NULL ,
    [PartNumber] [varchar] (30) NULL ,
    [ModelNumber] [varchar] (30) NULL ,
    [Casedetails] [text] NULL ,
    [DOA] [varchar] (10) NULL ,
    [UnitRepl] [tinyint] NULL ,
    [Onsite] [tinyint] NULL ,
    [ResellerName] [varchar] (50) NULL ,
    [PurchaseDt] [varchar] (20) NULL ,
    [CustomerType] [varchar] (30) NULL ,
    [Packcmplt] [tinyint] NULL ,
    [PackDt] [varchar] (10) NULL ,
    [PickupDt] [varchar] (10) NULL ,
    [DropofDt] [varchar] (10) NULL ,
    [PackCom] [varchar] (255) NULL ,
    [DropofCom] [varchar] (255) NULL ,
    [PickupCom] [varchar] (255) NULL ,
    [PackReq] [varchar] (30) NULL ,
    [Calldate] [datetime] NOT NULL ,
    [FaultCode] [varchar] (5) NULL ,
    [StatusChanged] [tinyint] NULL )

SELECT DISTINCT C.CallID 
FROM ChaseCalls C , ChaseActivities A
WHERE C.CallID = A.CallID
AND C.ServiceTypeCode = 'EURP'
AND A.ActivityCode = 'EWIP'
AND A.ActivityDate > 'yearFrom'
AND C.CallID NOT IN 
    (SELECT C.CallID
    FROM ChaseCalls C , ChaseActivities A
    WHERE C.CallID = A.CallID
    AND C.ServiceTypeCode = 'EURP'
    AND A.ActivityCode = 'EWIP'
    AND A.ActivityDate < 'yearFrom')
ORDER BY A.ActivityDate

"Imagination is more important than knowledge" - Albert Einstein


  • kaasszje
  • Registratie: Augustus 2001
  • Laatst online: 09-09 17:22

kaasszje

Live to Dare, Dare to Live

kan je gelijk nog aangeven in welk dbms je werkt.. aangezien bepaalde dbms-en ook eventuele andere oplossingen hebben

Ik ben verstopt zoek een ander :P


  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
Microsoft SQL Server 7.0

Ik ben nu een beetje aan het pielen met dan min(activiyDate) ... hopelijk dat het gaat werken

"Imagination is more important than knowledge" - Albert Einstein


  • Arx
  • Registratie: November 2001
  • Laatst online: 31-08 15:22

Arx

Two Thoughts Ahead!


SELECT DISTINCT ChaseCalls.CallID
FROM ChaseCalls , ChaseActivities
WHERE ChaseCalls.CallID = ChaseActivities.CallID
AND ServiceTypeCode = 'EURP'
AND ActivityCode = 'EWIP'
AND ActivityDate > 'yearFrom'
AND ChaseCalls.CallID NOT IN
(SELECT ChaseCalls.CallID
FROM ChaseCalls , ChaseActivities
WHERE ChaseCalls.CallID = ChaseActivities.CallID
AND ServiceTypeCode = 'EURP'
AND ActivityCode = 'EWIP'
AND ActivityDate < 'yearFrom')
ORDER BY ActivityDate


Hmmm, ik kan er overheen kijken, maareh... Die subselect is ook lekker overbodig.... (ik zie alleen maar een haakje verschil) Dit is voldoende: (je vergeet wat tabelnamen)

SELECT DISTINCT ChaseCalls.CallID
FROM ChaseCalls , ChaseActivities
WHERE ChaseCalls.CallID = ChaseActivities.CallID
AND tabelnaam.ServiceTypeCode = 'EURP'
AND tabelnaam.ActivityCode = 'EWIP'
AND tabelnaam.ActivityDate > 'yearFrom' ORDER BY tabelnaam.ActivityDate

Ik neem aan dat je wel een cascade relatie tussen de 2 tabellen hebt gemaakt met betreft CallID in ChaseCalls en ChaseActivities (ze zijn toch hetzelfde)? In iedergeval, als ze hetzelfde zijn, en ze zijn uniek (athans dat neem ik aan, je noemt ze ID's) waarom gebruik je dan DISTINCT?? Fout... en gevaarlijk >:) Als die relatie er niet is maak het dan, en haal distinct weg. Ten alle tijden vermijden, alleen te gebuiken in noodgevallen.

Suc6

Copywight 2000,2001,2002,2003,2004,2005,2006,2007 Arx. All wights wesewved. | PS Network tag -> Arx_nl


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

code:
1
2
3
4
5
6
7
8
9
SELECT C.CallID
    ,MIN(a.activityDate)
FROM   ChaseCalls C
    ,ChaseActivities A
WHERE  C.CallID = A.CallID
AND    C.ServiceTypeCode = 'EURP'
AND    A.ActivityCode = 'EWIP'
AND    A.ActivityDate > 'yearFrom'
GROUP BY C.CallID

Nog een opmerking op jouw query: Gebruik nooit gelijke aliassen in de subquery en in de hoofdquery. Dit leidt tot verwarring.

  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
De code zoals Goodielover die net gaf is idd bijna hetgeen zoals ik het wil hebben, alleen nu zouden de resultaten ook nog gesorteerd moeten worden op datum. Zodat de lijst van CallID's dus oploopt met de datum die het verste in het verleden ligt beginnend.

Iedereen iig super bedankt voor de hulp en nu ga ik weer ff verder klooien voor dat sorteren op datum :)

"Imagination is more important than knowledge" - Albert Einstein


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op woensdag 24 april 2002 16:29 schreef Ruud2001 het volgende:
De code zoals Goodielover die net gaf is idd bijna hetgeen zoals ik het wil hebben, alleen nu zouden de resultaten ook nog gesorteerd moeten worden op datum. Zodat de lijst van CallID's dus oploopt met de datum die het verste in het verleden ligt beginnend.

Iedereen iig super bedankt voor de hulp en nu ga ik weer ff verder klooien voor dat sorteren op datum :)
Hallo, daarvoor hoef je niet te klooien. Voeg toe onderaan:
code:
1
ORDER BY 2

  • Ruud2001
  • Registratie: November 2000
  • Laatst online: 21:15

Ruud2001

a.ka. Ruud2000

Topicstarter
Op woensdag 24 april 2002 16:31 schreef Goodielover het volgende:

Hallo, daarvoor hoef je niet te klooien. Voeg toe onderaan:
code:
1
ORDER BY 2
Who... you're the master *D

Ik wist niet eens dat dat kon joh, om ORDER BY en dan het getal van het item in de select te doen. Weer iets geleerd en extreem bedankt voor je hulp en alle anderen ook bedankt. Heb hier vandaag toch al de nodige boeken voor bekeken, internet afgezocht en me te pletter gepiekerd...

"Imagination is more important than knowledge" - Albert Einstein


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op woensdag 24 april 2002 16:45 schreef Ruud2001 het volgende:

[..]

Who... you're the master *D

Ik wist niet eens dat dat kon joh, om ORDER BY en dan het getal van het item in de select te doen. Weer iets geleerd en extreem bedankt voor je hulp en alle anderen ook bedankt. Heb hier vandaag toch al de nodige boeken voor bekeken, internet afgezocht en me te pletter gepiekerd...
Dat is nooit weg, hoef je volgende keer niet een vraag te stellen die je vandaag in een boek hebt gevonden.
Pagina: 1