Överkomplicerad SQL-query... [Löst]

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
ElectricMan
Inlägg: 4874
Blev medlem: 21 februari 2007, 20:22:48
Skype: ElectricManSwe
Ort: Luleå
Kontakt:

Överkomplicerad SQL-query... [Löst]

Inlägg av ElectricMan »

Det jag vill åstadkomma är att få en summa av hur mycket komponenterna i ett visst projekt kommer kosta.

Såhär ser en query jag använde mig utav ut:

Kod: Markera allt

"SELECT SUM(price) FROM data WHERE id in (SELECT projects_data_component_id FROM projects_data WHERE projects_data_project_id = "*ProjektID*")"
Med den queryn så får jag ut vad projektet kostar, om det bara är en av varje komponent i projektet.
Men i projects_data-tabellen finns det ett fält för varje komponent (projects_data_quantity) som anger hur många av komponenten som används i det projektet. Det antalet måste alltså multipliceras med priset för komponenten före det adderas med alla komponenter.


- I "data" finns priset (price), bland annat.

Kod: Markera allt

id  price
604 10
321 20
603 10
- Såhär ser "projects_data" ut:

Kod: Markera allt

projects_data_id projects_data_owner_id projects_data_project_id projects_data_component_id projects_data_quantity
27               1                      11                       604                        5
30               1                      11                       321                        4
38               1                      11                       603                        7
43               1                      8                        690                        10
Då ser vi att alla tre komponenter ska finnas med i projekt 11:
5 st 604, pris 10 -> Delsumma 50
4 st 321, pris 20 -> Delsumma 80
7 st 603, pris 10 -> Delsumma 70
Totalsumman för det projekte ska alltså bli: 50+80+70 = 200.


Hur gör jag en query som klarar det? :)
Måste jag kanske göra nån fler PHP While-sats eller något? Min skalle står helt still när det gäller någon lösning på det här problemet just nu...
Fråga om något är oklart!
Senast redigerad av ElectricMan 1 mars 2012, 21:49:11, redigerad totalt 1 gång.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Överkomplicerad SQL-query...

Inlägg av labmaster »

Hej!

Det är alltid lättare att hjälpa till om tabelldefinitionerna finns med i frågan men jag gör ett försök att komponera en SQL. Provkör den och återkom med besked ifall det funkar eller ej.

Kod: Markera allt

SELECT pd.projects_data_component_id "ComponentId", SUM(d.price*pd.projects_data_quantity) "Subtotal"
FROM projects_data pd, data d
WHERE pd.projects_data_component_id = d.id AND pd.projects_data_project_id = 11
GROUP BY pd.projects_data_component_id
ORDER BY pd.projects_data_component_id;
PHP:

Kod: Markera allt

$projectId = 11;

$query = sprintf("SELECT pd.projects_data_component_id \"ComponentId\",SUM(d.price*pd.projects_data_quantity) \"Subtotal\" FROM projects_data pd, data d WHERE pd.projects_data_component_id = d.id AND pd.projects_data_project_id = %s GROUP BY pd.projects_data_component_id ORDER BY pd.projects_data_component_id;",$projectId);
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Överkomplicerad SQL-query...

Inlägg av sodjan »

Eller för att beskriva det i ord, kör en JOIN istället för en sub-SELECT.
För övigt ser Labmasters SQL helt OK ut...
Användarvisningsbild
ElectricMan
Inlägg: 4874
Blev medlem: 21 februari 2007, 20:22:48
Skype: ElectricManSwe
Ort: Luleå
Kontakt:

Re: Överkomplicerad SQL-query...

Inlägg av ElectricMan »

Labmaster: Tack, men den där verkar bara ge radsumman? Inte totala summan.

Men det är bra att få se sån här komplicerad SQL-kod. Jag har börjat lära mig mer och mer SQL-kod nu, det finns ju så mycket annat än bara SELECT * FROM tabellen WHERE id = 2 :D


Såhär löstes frågan iaf, med lite hjälp av jine här på forumet: :)

Kod: Markera allt

SELECT SUM(total) 
FROM (SELECT projects_data_quantity * price AS total FROM projects_data JOIN `data` WHERE data.id = projects_data_component_id AND projects_data_project_id = "*ProjektID*") 
AS project_total
Användarvisningsbild
Jine
Inlägg: 1795
Blev medlem: 21 juli 2004, 20:25:56
Skype: Jim.Nelin
Ort: Trångsund, Stockholm
Kontakt:

Re: Överkomplicerad SQL-query... [Löst]

Inlägg av Jine »

Det går nog att skriva om min query till att inte använda en subquery alls, men jag orkade inte tänka.
Faktum är att jag inte skrivit ren SQL-kod på evigheter, NoSQL och ORM ftw.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Överkomplicerad SQL-query... [Löst]

Inlägg av labmaster »

Jag ber om ursäkt ElectricMan. Jag tappade bort att du skulle ha totalsumman per projekt. Då blir det så här:

Kod: Markera allt

SELECT pd.projects_data_id "projectId", SUM(d.price*pd.projects_data_quantity) "Subtotal"
FROM projects_data pd, data d
WHERE pd.projects_data_component_id = d.id AND pd.projects_data_project_id = 11
GROUP BY pd.projects_data_id
ORDER BY pd.projects_data_id;
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Överkomplicerad SQL-query... [Löst]

Inlägg av sodjan »

> Men det är bra att få se sån här komplicerad SQL-kod.

Vardå? Jag har bara sett SQL'en i just denna tråd.
Väldigt basic nivå på det... :-)

> Tack, men den där verkar bara ge radsumman? Inte totala summan.

Du får summering på det begrepp som du har som argument till GROUP BY.
Skriv svar