ze4lot
24.06.2013, 12:34:20
Witam
Posiadam tabelę 'sub_order' (sub_order_Id | tool_id | client_id)
oraz dwie tabele 'tools' (tool_id, tool_name) oraz 'clients' (client_id, client_name).
Potrzebuję stworzyć zapytanie sql tak aby wygenerowało mi tabelę krzyżową, gdzie kolumny to elementy tool_name, a wiersze to elementy client_name. Na skrzyżowaniach suma wierszy gdzie pojawiają się tool_id z tlient_id.
Generalnie chodzi o zaprezentowanie ile danych narzędzi kupili poszczególni klienci.
Bardzo proszę o pomoc w stworzeniu zapytania, a szczególnie będę wdzięczny jeśli ktoś poda jakiś ciekawy link z wyjaśnieniem podobnego problemu.
mmmmmmm
24.06.2013, 12:50:24
SELECT
client_id,
Count(CASE WHEN tool_id=1 THEN order_id END) tool1,
Count(CASE WHEN tool_id=2 THEN order_id END) tool2,
Count(CASE WHEN tool_id=3 THEN order_id END) tool3,
...
FROM
sub_order
GROUP BY client_id
ze4lot
24.06.2013, 13:19:20
@mmmmmmm
Dzięki za pomoc ale szukam rozwiązania gdzie ilość unikalnych elementów tool oraz client jest nieznana.
EDIT:
Dla lepszego zrozumienia o co mi chodzi poniżej moja wizja tego co powinno zwrócić zapytanie:
______| maciek | michał | tomek | ...
bułka | 3 | 0 | 6 | ...
banan | 3 | 2 | 2 | ...
masło | 1 | 4 | 1 | ...
... | ... | ... | ... | ...
bpskiba
24.06.2013, 18:05:28
Przykro mi, ale MySQL nie posiada gotowej funkcji tworzącej tebele przestawne.
Taki mechanizm istnieje w produktach Microsoftu czyli MSSQL. Jest to funkcja PIVOT
Oczywiście, w MySQL da się to również wykonać, ale trzeba napisać np. własną funkcję...
W googlach pod hasłem mysql pivot znajdziesz trochę pomysłów, ale wszystkie mają swoje dobre i złe strony.
Swoją drogą może php.net zaproponuje konkurs na napisanie takiej uniwersalnej funkcji
(konkurs może być z nagrodami)