Dołączenie danych (wiersze jako kolumna) z tej samej tabeli (JOIN ?)

Dołączenie danych (wiersze jako kolumna) z tej samej tabeli (JOIN ?)
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
1

Mam w excelu tabelę tego typu.

Owoc Dok Odbiorca Ilość Masa Wartość
TRUSKAWKA FD2/ Franek 288 288 67,00 zł
TRUSKAWKA FD2/ Franek 288 288 67,00 zł
TRUSKAWKA FD2/ Franek 288 288 67,00 zł
MALINA FD2/ Franek 288 288 67,00 zł
MALINA FD2/ Franek 288 288 67,00 zł
MALINA FD2/ Franek 288 288 67,00 zł
TRUSKAWKA FD2/ Franek 288 288 67,00 zł
MALINA FD2/ Kazik 768 768 190,00 zł
TRUSKAWKA FD2/ Kazik 384 384 95,00 zł
TRUSKAWKA KWPZ Franek 64 32 87,00 zł
TRUSKAWKA KWPZ Franek 55 27 87,00 zł
TRUSKAWKA KWPZ Kazik 28 12 44,00 zł
TRUSKAWKA FV/F Piotr 420 420 88,00 zł
TRUSKAWKA FV/F Piotr 120 60 15,00 zł
BORÓWKA FV/F Stefan 130 65 14,00 zł
BORÓWKA FV/F Stefan 180 180 37,00 zł
TRUSKAWKA FV/F Lutek 3855 3855 134,00 zł
TRUSKAWKA FV/F Czesław 30 15 3,00 zł
MALINA RW/G Czesław 2 4 2,00 zł

Docelowo chciałbym uzyskać taką tabelę:

Owoc Dok Odbiorca Ilość Masa Wartość Wartość_KWPZ
BORÓWKA FV/F Stefan 310 245 51,00 zł
MALINA FD2/ Franek 864 864 201,00 zł
MALINA FD2/ Kazik 768 768 190,00 zł
TRUSKAWKA FD2/ Franek 1152 1152 268,00 zł 174,00 zł
TRUSKAWKA FD2/ Kazik 384 384 95,00 zł 44,00 zł
TRUSKAWKA FV/F Czesław 30 15 3,00 zł
TRUSKAWKA FV/F Lutek 3855 3855 134,00 zł
TRUSKAWKA FV/F Piotr 540 480 103,00 zł
Kopiuj
Select Owoc, Dok, Odbiorca, sum(Ilość) as Ilość, sum(Masa) as Masa, sum(Wartość) as Wartość From [arkusz1$] where Dok in ('FV/F','FD2/') group by Owoc, Dok, Odbiorca

Powyższe polecenie generuje mi tabelę do kolumny Wartość. Nie potrafię natomiast dodać kolumny Wartość_KWPZ.

edytowany 1x, ostatnio: cerrato
TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0

A to pole Wartość_KWPZ to jakaś wartość wyliczalna, funkcja którą się da zapisać? I dlaczego raz występuje a raz wiersz jest pusty?

edytowany 1x, ostatnio: Riddle
Riddle
@TytusRomek: Super że odpowiadasz na pytania w wątku! Wartości związane z programowaniem, takie jak nazwy pól, postaraj się osadzać w tekst formatowany: `Wartość_KWPZ`.
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0

Zobacz tabelę źródłową. Dokument KWPZ występuje 3 razy.
2x dla owocu truskawka i odbiorcy Franek = 87+87= 174 zł
1x dla owocu truskawka i odbiorcy Kazik = 44 zł

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 3 godziny
  • Postów:3866
2

Nie potrzebujesz joina:

Kopiuj
Select 
	Owoc
	, Dok
	, Odbiorca
	, sum(case when Dok in ('FV/F','FD2/') then Ilość else 0 end) as Ilość
	, sum(case when Dok in ('FV/F','FD2/') then Masa else 0 end) as Masa
	, sum(case when Dok in ('FV/F','FD2/') then Wartość else 0 end) as Wartość 
	, sum(case when Dok in ('KWPZ') then Wartość else 0 end) as Wartość_kwpz 
From 
	[arkusz1$] 
where 
	Dok in ('FV/F','FD2/','KWPZ') 
group by 
	Owoc
	, Dok
	, Odbiorca
edytowany 1x, ostatnio: Panczo
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0

Przepraszam, że nie wyraziłem się jasno na początku. Działam pod VBA (Excel) i konstrukcja case when nie jest obsługiwana.

edytowany 1x, ostatnio: zielinskit
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 3 godziny
  • Postów:3866
0

Piszesz w bazach danych, oznaczasz jako mssql, nawet w pierwszym poście dajesz sql-a którego używasz, to gdzie te dane są?

edytowany 1x, ostatnio: Panczo
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0

Dane mam w Excel'u, muszę obrobić w VBA.
Zamieściłem w bazach, ponieważ mam problem z zapytaniem SQL.

Kod VBA:

Kopiuj
Sub UTA()
Dim ws As Worksheet
Dim conn As ADODB.Connection
set conn = New ADODB.Connection

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & ActiveWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES"";"
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim qSelectInvDetails As String

qSelectInvDetails = "Select Owoc, Dok, Odbiorca, sum(Ilość) as Ilość, sum(Masa) as Masa, sum(Wartość) as Wartość From [arkusz1$] where Dok in ('FV/F','FD2/') group by Owoc, Dok, Odbiorca"

rs.Open qSelectInvDetails, conn
ws.Range("P2").CopyFromRecordset rs

rs.Close
conn.Close

Set rs = Nothing
Set conn = Nothing

End Sub
edytowany 1x, ostatnio: zielinskit
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 3 godziny
  • Postów:3866
0

to zamien case na iif iif(Dok = "FV/F" or Dok = "FD2/",Wartość,0)

edytowany 1x, ostatnio: Panczo
TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0

OK. chyba mam coś blisko, nie jest to piękne rozwiązanie ale wygląa żę działa.
Tylko usuń z kwerendy Dok. Bo robi zamieszanie.
u mnie działa to:

Kopiuj
sql = "Select Owoc, Odbiorca, sum(Ilosc) as Ilosc, sum(Masa) as Masa, sum(Wartosc) as Wartosc, sum(WartoscKWPZ) as WartoscKWPZ From (Select Owoc, Odbiorca, sum(Ilosc) as Ilosc, sum(Masa) as Masa, sum(Wartosc) as Wartosc, sum(0) as WartoscKWPZ From [Arkusz1$] where Dok in ('FV/F','FD2/') group by Owoc, Odbiorca "
sql = sql & "UNION ALL "
sql = sql & "Select Owoc, Odbiorca, sum(0) as Ilosc, sum(0) as Masa, sum(0) as Wartosc, sum(Wartosc) as WartoscKWPZ From [Arkusz1$] where Dok in ('KWPZ') group by Owoc, Odbiorca) group by Owoc, Odbiorca"

a wynik (bez nagłóków) mam taki:
BORÓWKA;Stefan;310;245;51;0;
MALINA;Franek;864;864;201;0;
MALINA;Kazik;768;768;190;0;
TRUSKAWKA;Czesław;30;15;3;0;
TRUSKAWKA;Franek;1152;1152;268;174;
TRUSKAWKA;Kazik;384;384;95;44;
TRUSKAWKA;Lutek;3855;3855;134;0;
TRUSKAWKA;Piotr;540;480;103;0;

Ten numer dokumentu o któym wspominam robi zamieszanie przy agregacji.

ps
usunąłem Polskei znaki zarówno z arkusza jak i z kwerendy więc u siebie musisz poprawić.

edytowany 1x, ostatnio: TytusRomek
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0
Panczo napisał(a):

to zamien case na iif iif(Dok = "FV/F" or Dok = "FD2/",Wartość,0)

Zamieniłem kod na:

Kopiuj
Sql = "Select Owoc, Dok, Odbiorca"
Sql = Sql & ", sum(iif(Dok = 'FV/F' or Dok = 'FD2/',Ilosc,0)) as Ilosc "
Sql = Sql & ", sum(iif(Dok = 'FV/F' or Dok = 'FD2/',Masa,0)) as Masa "
Sql = Sql & ", sum(iif(Dok = 'FV/F' or Dok = 'FD2/',Wartosc,0)) as Wartosc "
Sql = Sql & ", sum(iif(Dok = 'KWPZ',Wartosc,0)) as KWPZ "
Sql = Sql & "From [arkusz1$] "
Sql = Sql & "where Dok in ('FV/F','FD2/','KWPZ') Group by Owoc, Dok, Odbiorca"

ale dostaję taki wynik (te wartości powinny tam gdzie obramowane na czerwono pola):
screenshot-20240919074543.png

ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0
TytusRomek napisał(a):

OK. chyba mam coś blisko, nie jest to piękne rozwiązanie ale wygląa żę działa.
Tylko usuń z kwerendy Dok. Bo robi zamieszanie.
Ten numer dokumentu o któym wspominam robi zamieszanie przy agregacji.

Jest faktycznie blisko, z tym, że brak numeru Dok.
screenshot-20240919075728.png

Numer Dok przy agregacji jest niestety konieczny, świadczy o typie wysyłki (krajowa czy zagraniczna). Muszę uzyskać tabelę wyjściową jak w pierwszym poście.

edytowany 1x, ostatnio: zielinskit
TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0
zielinskit napisał(a):
TytusRomek napisał(a):

OK. chyba mam coś blisko, nie jest to piękne rozwiązanie ale wygląa żę działa.
Tylko usuń z kwerendy Dok. Bo robi zamieszanie.
Ten numer dokumentu o któym wspominam robi zamieszanie przy agregacji.

Jest faktycznie blisko, z tym, że brak numeru Dok.
screenshot-20240919075728.png

Numer Dok przy agregacji jest niestety konieczny, świadczy o typie wysyłki (krajowa czy zagraniczna). Muszę uzyskać tabelę wyjściową jak w pierwszym poście.

Rozumiem. Przy całej mojej wiedzy nie da się tego zrobić za pomocą kwerendy sql - sam już widzisz co powoduje numer Dok użyty w agregacji.
Jeśli używasz VBA, to może spróbuj dokleić te dane (kolumnę KPWZ) pętlą z jakiejś tablicy i sumy jeżeli.

TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0
zielinskit napisał(a):
TytusRomek napisał(a):

OK. chyba mam coś blisko, nie jest to piękne rozwiązanie ale wygląa żę działa.
Tylko usuń z kwerendy Dok. Bo robi zamieszanie.
Ten numer dokumentu o któym wspominam robi zamieszanie przy agregacji.

Jest faktycznie blisko, z tym, że brak numeru Dok.
screenshot-20240919075728.png

Numer Dok przy agregacji jest niestety konieczny, świadczy o typie wysyłki (krajowa czy zagraniczna). Muszę uzyskać tabelę wyjściową jak w pierwszym poście.

Jeszcze jedna myśl. Patrząc na oryginalną tabelę i tę którą chcesz otrzymać, to też nie jesteś w stanie zrobić tego sam.
Jeśli dla Truskawki/Franka będziesz miał więcej niż jeden typ dokumentu- czyli kraj czy zagranica- to nie ma logiki w tych danych która mogłaby pozowolić przyporządkować
agragację odpowiednio.
Coś istotnego pominąłeś bo według Twojego przykładu u Franka jest tylko jeden rodzaj wysyłki.

ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0
TytusRomek napisał(a):

Jeszcze jedna myśl. Patrząc na oryginalną tabelę i tę którą chcesz otrzymać, to też nie jesteś w stanie zrobić tego sam.
Jeśli dla Truskawki/Franka będziesz miał więcej niż jeden typ dokumentu- czyli kraj czy zagranica- to nie ma logiki w tych danych która mogłaby pozowolić przyporządkować
agragację odpowiednio.
Coś istotnego pominąłeś bo według Twojego przykładu u Franka jest tylko jeden rodzaj wysyłki.

Tak wiem, na szczęście nie ma takiej możliwości. Tabela jest czysto teoretyczna.
W praktyce przykładowy Franek to odbiorca krajowy i będzie miał tylko jeden typ dokumentu - FV/F, natomiast Kazik to odbiorca zagraniczny (typ dokumentu FD2/).

TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0
zielinskit napisał(a):
TytusRomek napisał(a):

Jeszcze jedna myśl. Patrząc na oryginalną tabelę i tę którą chcesz otrzymać, to też nie jesteś w stanie zrobić tego sam.
Jeśli dla Truskawki/Franka będziesz miał więcej niż jeden typ dokumentu- czyli kraj czy zagranica- to nie ma logiki w tych danych która mogłaby pozowolić przyporządkować
agragację odpowiednio.
Coś istotnego pominąłeś bo według Twojego przykładu u Franka jest tylko jeden rodzaj wysyłki.

Tak wiem, na szczęście nie ma takiej możliwości. Tabela jest czysto teoretyczna.
W praktyce przykładowy Franek to odbiorca krajowy i będzie miał tylko jeden typ dokumentu - FV/F, natomiast Kazik to odbiorca zagraniczny (typ dokumentu FD2/).

W takim razie Dok nie jest Ci potrzebny do niczego w samej kwerendzie.

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 3 godziny
  • Postów:3866
1

Dok, faktycznie jest potrzebny, ale można joinem:

Kopiuj
SELECT
	m.owoc
	,m.dok
	,m.odbiorca
	,m.ilość
	,m.Masa
	,m.Wartość
	,kwpz.wartość_kwpz
FROM
	(Select 
		Owoc
		, Dok
		, Odbiorca
		, sum(ilość) as Ilość
		, sum(masa) as Masa
		, sum(wartość) as Wartość 
	From 
		[arkusz1$] 
	where 
		Dok in ('FV/F','FD2/') 
	group by 
		Owoc
		, Dok
		, Odbiorca) as m
	LEFT JOIN (Select 
				Owoc
				, Odbiorca
				, sum(Wartość) as Wartość_kwpz 
			From 
				[arkusz1$] 
			where 
				Dok = 'KWPZ'
			group by 
				Owoc
				, Odbiorca) as kwpz on kwpz.owoc=m.owoc and kwpz.odbiorca = m.odbiorca
edytowany 2x, ostatnio: Panczo
TR
  • Rejestracja:ponad rok
  • Ostatnio:6 dni
  • Postów:85
0
Panczo napisał(a):

Dok, faktycznie jest potrzebny, ale można joinem:

to ja będę się upierał - dlaczego i gdzie jest potrzebny? też nie korzystasz w join z niego. I wiesz, że z Dok logika zapytania nie do zrobienia.
jeśli Dok ma odposiwednik w polu Odbiorca to z teorii nie zachowujemy postaci normalnych.

Swoją drogą, podoba mi się Twój skrypt, ale działa tak jak mój tylko dlatego że nie używasz Dok. Dwie różne wartości Dok dla Franka/Truskawki rozsypią te rozwiązania.

ps chyba (nie wykluczam) że czegoś nie wiem?

edytowany 1x, ostatnio: TytusRomek
PA
zgubiłem "nie" pisząc posta ;)
TR
@Panczo: tak czułem, ale ja lamer więc wolałem dopytać :)
ZI
  • Rejestracja:prawie 9 lat
  • Ostatnio:6 miesięcy
  • Postów:10
0
Panczo napisał(a):

Dok, faktycznie jest potrzebny, ale można joinem:

Kopiuj
SELECT
	m.owoc
	,m.dok
	,m.odbiorca
	,m.ilość
	,m.Masa
	,m.Wartość
	,kwpz.wartość_kwpz
FROM
	(Select 
		Owoc
		, Dok
		, Odbiorca
		, sum(ilość) as Ilość
		, sum(masa) as Masa
		, sum(wartość) as Wartość 
	From 
		[arkusz1$] 
	where 
		Dok in ('FV/F','FD2/') 
	group by 
		Owoc
		, Dok
		, Odbiorca) as m
	LEFT JOIN (Select 
				Owoc
				, Odbiorca
				, sum(Wartość) as Wartość_kwpz 
			From 
				[arkusz1$] 
			where 
				Dok = 'KWPZ'
			group by 
				Owoc
				, Odbiorca) as kwpz on kwpz.owoc=m.owoc and kwpz.odbiorca = m.odbiorca

Działa perfekcyjnie. O to chodziło. Wielkie dzięki za pomoc.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)