---
title: "Knepig SQL-sats"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/79625-knepig-sql-sats"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Jon"
published: "2003-06-13T08:00:23.000Z"
updated: "2003-06-13T11:33:03.000Z"
replies: 6
views: 225
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/79625-knepig-sql-sats"
---

# Knepig SQL-sats

## #1 — Jon, 2003-06-13T08:00Z

Pular med ett ärendehanteringssystem. Har lite problem att visa ärendena som jag vill. Datamodellen lite strippad och förenklad ser ut enligt följande: (inte så snyggt men ni kanske ser hur jag menar)

\* = Primärnyckel
\# = Främmande nyckel

```
|Task----------|   |Priority--------|   |Customer-------| |Employee----|
|----------------|   |------------|   |---------------| |----------------|
|*TaskId------|   |*PriorityId---|   |*CustomerId---| |*EmployId---|
|#PriorityId---|   |PriorityName|   |CustomerName|  |EmployName|
|#CustomerId|   
|#EmployId---|   
|TaskRegdate|
|TaskDeadline|
|TaskText------|
```

Det som är problemet är SQL-satsen. Tänkte göra en Stored Proc för att visa alla ärenden. Problemet är att jag vill sortera dem på prioritet men ändå få samma kunder under varandra. I andra hand vill jag sortera på registreringsdatum.

Det skulle resultera i något sånt här: (inte så snyggt men ni kanske ser hur jag menar igen)

Prio      Kund            Regdatum     Tekniker         Att göra
\---------------------------------------------------------------------------
Hög      Kalle Kula     2003-05-04   Bosse Bula     Laga saker
Mellan  Kalle Kula     2003-06-01   Lisa Lus          Fixa Saker
Låg      Kalle Kula     \*\*\*\*              \*\*\*\*\*            \*\*\*\*\*\*
Hög      Lena Lila      \*\*\*\*\*          \*\*\*\*\*\*           \*\*\*\*\*\*
Låg       Lena Lila     \*\*\*\*            \*\*\*\*\*\*           \*\*\*\*\*\*
Mellan  Fia Krok       \*\*\*\*              \*\*\*\*\*             \*\*\*\*\*\*

Problemet är som sagt att få det per Kund.

SQL hittils något i stil med:

```
SELECT * From Task, Priority, Kund, Customer, Employee
WHERE 
Task.PriorityId = Priority.PriorityId AND
Taks.CustomerId = Customer.CustomerId AND
Taks.EmployId = Employee.EmployId
ORDER BY PriorityId ASC, Task.Deadline Task.RegDate ASC;
```

Detta resulterar naturligtvis inte i det jag vill att det ska göra med det står still i huvudet (och har gjort så ett tag)  :)

Puh! Mycket eller?

Permalänk: https://www.webforum.nu/p/79625

## #2 — LarsG, 2003-06-13T08:19Z

```
SELECT * From Task, Priority, Customer, Employee
WHERE 
Task.PriorityId = Priority.PriorityId AND
Taks.CustomerId = Customer.CustomerId AND
Taks.EmployId = Employee.EmployId
ORDER BY Customer.CustomerId, 
PriorityId ASC, Task.Deadline Task.RegDate ASC
```

Permalänk: https://www.webforum.nu/p/1082239

## #3 — Jon, 2003-06-13T09:17Z

Ok. det var ju det jag frågade efter men jag tror att jag frågar efter "fel sak". Är lite dimmig i formuleringarna idag :)

Säg att man letar reda på det ärende som har äldst Deadline. Plocka då fram alla ärenden som den kund som äger det ärendet har och visa dem i prioritetsordning, sen kommer det ärende som har nästa Deadline... osv.

Är det väldigt oklart formulerat?

Är det ett vettigt sätt att visa det hela på för övrigt?
Tänkte att man vill ha upp det ärendet som skall behandlas fortast överst men sen vill man ju inte att samma kund ska dyka upp tio rader senare så man missar att göra något och får springa tillbaks.

Permalänk: https://www.webforum.nu/p/1082288

## #4 — UlfT, 2003-06-13T09:38Z

> **Jon skrev:**
>
> Säg att man letar reda på det ärende som har äldst Deadline. Plocka då fram alla ärenden som den kund som äger det ärendet har och visa dem i prioritetsordning, sen kommer det ärende som har nästa Deadline... osv.

Vilket är i så fall nästkommande ärende? Om det råkar ägas av samma kund som ägde det första ärendet, har det redan räknats upp. Och även om så inte är fallet, kommer du med den här logiken få massor med dubbla, tredubbla, etc, uppräkningar av varje ärende.

> **Jon skrev:**
>
> Är det ett vettigt sätt att visa det hela på för övrigt?
> Tänkte att man vill ha upp det ärendet som skall behandlas fortast överst men sen vill man ju inte att samma kund ska dyka upp tio rader senare så man missar att göra något och får springa tillbaks.

Här frågar du efter något liknande som LarsG svarade på. Du skulle enkelt kunna fixa detta genom att modifiera hans svar något. Du behöver egentligen bara byta plats på några av kolumnerna efter "ORDER BY", så kan du sortera som du vill. Förslagsvis låter du slutet på satsen lyda: 

```
ORDER BY Customer.CustomerID, Task.DeadLine, Priority
```

Permalänk: https://www.webforum.nu/p/1082309

## #5 — Jon, 2003-06-13T09:51Z

NJae... Jag tror inte riktigt att jag uttrycker mig klart.

Ett ärende skall bara dyka upp en gång.

1\. välj ärende med deadline som går ut om kortast tid
2\. visa det ärendet och alla ärenden som hör till samma kund.
3\. gå vidare till nästa ärende och gör samma sak.

Det kanske behövs lite programmeras lite oxå... hmmm...

Jag har varit inne lite på en subquery men får inte ihop det riktigt ändå.

Permalänk: https://www.webforum.nu/p/1082316

## #6 — UlfT, 2003-06-13T09:59Z

Du vill visa alla ärenden som hör ihop med en kund, tillsammans. Då sorterar du på kund i första hand.

Därefter vill du, för varje kund, sortera kundens ärenden i deadline-ordning. Då sorterar du på deadline i andra hand.

Sedan kan du om du vill sortera med avseende på prioritet på exakt samma vis, dvs prioritetsordning i tredje hand.

Du klarar allt detta med en enda sql-fråga.

Permalänk: https://www.webforum.nu/p/1082320

## #7 — Jon, 2003-06-13T11:33Z

Ja! Där der man...
Det är klart att det funkar som ni säger :)

Tack för hjälpen.

Permalänk: https://www.webforum.nu/p/1082396

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/79625-knepig-sql-sats
