/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
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
Hjælp til en halvkompliceret subselection
Fra : Henrik Pedersen


Dato : 14-06-08 22:52

Hejsan

Jeg er gået lidt i stå på følgende.
Det drejer sig om salgsordre pr. periode og type
Hver periode findes max. 3 gange, 1 gang for hver ordretype.
Jeg har en tabel der ser ud som følger.

Period OT Count Total
String int int real
10:00-10:30 1 12 123.65
10:00-10:30 2 8 21.65
10:00-10:30 3 124 6542.43
10:30-11:00 2 4 321.76
10:30-11:00 3 76 4899.02
11:00-11:30 2 43 2900.76
osv.

Den query jeg kunne tænke mig formulere skal producere det følgende:
Period 1_Count 1_Total 2_Count 2_Total 3_Count 3_Total
10:00-10:30 12 123.65 8 21.65 124 6542.43
10:30-11:00 - - 4 321.76 76 4899.02
11:00-11:30 - - 43 2900.76 - -
osv.

Jeg vil mene at det er noget subselection jeg skal have fat i.
Kombinationen Period og OT er unik.

Er der nogle der har et godt bidrag til en løsning.

Henrik

 
 
Jens Gyldenkærne Cla~ (15-06-2008)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-06-08 23:36

Henrik Pedersen skrev:

> Det drejer sig om salgsordre pr. periode og type
> Hver periode findes max. 3 gange, 1 gang for hver ordretype.

Et view pr. ordretype og så en FULL OUTER JOIN mellem dem skulle
give dig det ønskede:

CREATE VIEW v1 AS
SELECT Period, Count as C1, Total as T1
FROM tabel a
WHERE OT = 1

GO

CREATE VIEW v2 AS
SELECT Period, Count as C2, Total as T2
FROM tabel a
WHERE OT = 2

GO

CREATE VIEW v3 AS
SELECT Period, Count as C3, Total as T3
FROM tabel a
WHERE OT = 3

GO

SELECT v1.Period, C1, T1, C2, T2, C3, T3
FROM v1 FULL OUTER JOIN v2
ON v1.Period = v2.Period
FULL OUTER JOIN v3
ON v2.Period = v3.Period


I stedet for views kan det også laves med subselects i paranteser.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Kristian Damm Jensen (16-06-2008)
Kommentar
Fra : Kristian Damm Jensen


Dato : 16-06-08 14:16

Jens Gyldenkærne Clausen wrote:
> Henrik Pedersen skrev:
>
>> Det drejer sig om salgsordre pr. periode og type
>> Hver periode findes max. 3 gange, 1 gang for hver ordretype.
>
> Et view pr. ordretype og så en FULL OUTER JOIN mellem dem skulle
> give dig det ønskede:
>
> CREATE VIEW v1 AS
> SELECT Period, Count as C1, Total as T1
> FROM tabel a
> WHERE OT = 1
>
> GO
>
> CREATE VIEW v2 AS
> SELECT Period, Count as C2, Total as T2
> FROM tabel a
> WHERE OT = 2
>
> GO
>
> CREATE VIEW v3 AS
> SELECT Period, Count as C3, Total as T3
> FROM tabel a
> WHERE OT = 3
>
> GO
>
> SELECT v1.Period, C1, T1, C2, T2, C3, T3
> FROM v1 FULL OUTER JOIN v2
> ON v1.Period = v2.Period
> FULL OUTER JOIN v3
> ON v2.Period = v3.Period
>
>
> I stedet for views kan det også laves med subselects i paranteser.

Der er såmænd ikke nogen speciel grund til at lave views.

SELECT v1.Period, C1, T1, C2, T2, C3, T3
FROM tabel a
FULL OUTER JOIN tabel b
ON a.Period = b.Period
AND a.OT=1
AND b.OT=2
FULL OUTER JOIN tabel c
ON b.Period = c.Period
AND c.OT=3

vil fungere lige så godt.

Der er bare ét problem: Hvis der findes OT=1 og OT=3 men ikke OT=2, vil
disse to forekomster ikke blive bundet sammen.


--
Venlig hilsen /Best regards
Kristian Damm Jensen



Henrik Pedersen (16-06-2008)
Kommentar
Fra : Henrik Pedersen


Dato : 16-06-08 20:09

Kristian Damm Jensen wrote:

> Jens Gyldenkærne Clausen wrote:
>> Henrik Pedersen skrev:
>>
>>> Det drejer sig om salgsordre pr. periode og type
>>> Hver periode findes max. 3 gange, 1 gang for hver ordretype.
>>
>> Et view pr. ordretype og så en FULL OUTER JOIN mellem dem skulle
>> give dig det ønskede:
>>
>> CREATE VIEW v1 AS
>> SELECT Period, Count as C1, Total as T1
>> FROM tabel a
>> WHERE OT = 1
>>
>> GO
>>
>> CREATE VIEW v2 AS
>> SELECT Period, Count as C2, Total as T2
>> FROM tabel a
>> WHERE OT = 2
>>
>> GO
>>
>> CREATE VIEW v3 AS
>> SELECT Period, Count as C3, Total as T3
>> FROM tabel a
>> WHERE OT = 3
>>
>> GO
>>
>> SELECT v1.Period, C1, T1, C2, T2, C3, T3
>> FROM v1 FULL OUTER JOIN v2
>> ON v1.Period = v2.Period
>> FULL OUTER JOIN v3
>> ON v2.Period = v3.Period
>>
>>
>> I stedet for views kan det også laves med subselects i paranteser.
>
> Der er såmænd ikke nogen speciel grund til at lave views.
>
> SELECT v1.Period, C1, T1, C2, T2, C3, T3
> FROM tabel a
> FULL OUTER JOIN tabel b
> ON a.Period = b.Period
> AND a.OT=1
> AND b.OT=2
> FULL OUTER JOIN tabel c
> ON b.Period = c.Period
> AND c.OT=3
>
> vil fungere lige så godt.
>
> Der er bare ét problem: Hvis der findes OT=1 og OT=3 men ikke OT=2, vil
> disse to forekomster ikke blive bundet sammen.
>
>

Den sidste kombination kan godt forekomme.
Jeg endte med at bruge et array i php til at løse opgaven, men tippet er
noteret.

Tak skal i have

Henrik

Kaj Julius (13-07-2008)
Kommentar
Fra : Kaj Julius


Dato : 13-07-08 12:30


"Henrik Pedersen" <henrik.kirneh@gmail.com> skrev i en meddelelse
news:48543d87$0$90274$14726298@news.sunsite.dk...
> Hejsan
>
> Jeg er gået lidt i stå på følgende.
> Det drejer sig om salgsordre pr. periode og type
> Hver periode findes max. 3 gange, 1 gang for hver ordretype.
> Jeg har en tabel der ser ud som følger.
>
> Period OT Count Total
> String int int real
> 10:00-10:30 1 12 123.65
> 10:00-10:30 2 8 21.65
> 10:00-10:30 3 124 6542.43
> 10:30-11:00 2 4 321.76
> 10:30-11:00 3 76 4899.02
> 11:00-11:30 2 43 2900.76
> osv.
>
> Den query jeg kunne tænke mig formulere skal producere det følgende:
> Period 1_Count 1_Total 2_Count 2_Total 3_Count 3_Total
> 10:00-10:30 12 123.65 8 21.65 124 6542.43
> 10:30-11:00 - - 4 321.76 76 4899.02
> 11:00-11:30 - - 43 2900.76 - -
> osv.
>
> Jeg vil mene at det er noget subselection jeg skal have fat i.
> Kombinationen Period og OT er unik.
>
> Er der nogle der har et godt bidrag til en løsning.
>
> Henrik

Mit husmandsforslag ville være:

SELECT Period,
SUM(CASE WHEN OT=1 THEN 1 ELSE 0 END)) AS 1_Count, SUM(CASE WHEN OT=1
THEN Total ELSE 0 END)) AS 1_Total,
SUM(CASE WHEN OT=2 THEN 1 ELSE 0 END)) AS 2_Count, SUM(CASE WHEN OT=2
THEN Total ELSE 0 END)) AS 2_Total,
SUM(CASE WHEN OT=3 THEN 1 ELSE 0 END)) AS 3_Count, SUM(CASE WHEN OT=3
THEN Total ELSE 0 END)) AS 2_Total
FROM dinTabel
GROUP BY Period

Ikke så fancy, som de andres forslag, men lige så effektivt...

Hvis du insisterer på, at der skal returneres en NULL værdi, hvis der ikke
har være registreret noget salg på en OT, så kunne det sikker også laves.
Uden at være 100% sikker (har ikke prøvet det), vil jeg tro, at det eneste
du behøver er at erstatte 0 med NULL i CASE konstruktionernes ELSE værdi.



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste