Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Znalazłem (i uruchomiłem nawet) fajną ciekawostkę ad SQLka:
(Działa tylko w SQL Server, nie działa w Accessie, Excelu, itp.)
Ale AFIN może to uruchamiać - uruchomiłem to właśnie w AFINIE.

Funkcja UNPIVOT (stąd przykład):
http://technet.microsoft.com/en-us/library/ms177410.aspx

ZASTOSOWANIE:
Konsolidacja budżetów

Tłumaczenie na polski:
Mamy duuużo budżetów, oczywiście w arkuszach Excela. Stawiamy komputer z SQL Serverem Expressem (żeby było taniej, żeby baza była 'porządna', tzn. żeby informatyk nie marudził, że jakiś Access, albo Excel).
I... (jedno kliknięcie w AFIN.NET.IS)... pyk... i mamy dane do dowolnych budżetowych tabel przestawnych

Przygotowanie (przykładowych) danych
DROP TABLE pvt
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int)
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);

Normalizacja:
SELECT VendorID, Employee, Orders FROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) p UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5)) AS unpvt

Widok danych:
VendorID Emp1 Emp2 Emp3 Emp4 Emp5
1 4 3 5 4 4
2 4 1 5 5 5
3 4 3 5 4 4
4 4 2 5 5 4
5 5 1 5 5 5

Widok efektu końcowego (to działa!):
VendorID Employee Orders
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
3 Emp1 4
3 Emp2 3
3 Emp3 5
3 Emp4 4
3 Emp5 4
4 Emp1 4
4 Emp2 2
4 Emp3 5
4 Emp4 5
4 Emp5 4
5 Emp1 5
5 Emp2 1
5 Emp3 5
5 Emp4 5
5 Emp5 5

Pytania?Wojciech Gardziński edytował(a) ten post dnia 12.01.10 o godzinie 13:44

konto usunięte

Temat: SQL - ciekawostki

działa od wersji 2005 wspomnianego MSSQL-a - to tak dla ścisłości
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Przemysław R.:
działa od wersji 2005 wspomnianego MSSQL-a - to tak dla ścisłości
Zgadza się. Nawet nie wiem, czy MySQL, Oracle itp.?

Przy okazji, potrzebujemy (do ładnego robienia kostek) specyfikację funkcji formatujących tekst z innych wartości, tj. mam dla Accessa:
format(data,'yyyy_mm') czyli z daty robi tekst '2010_01'

Ale jak to zrobić w SQLS, MySQL'u, Oracle'u?

konto usunięte

Temat: SQL - ciekawostki

MSSQL - tu trzeba kombinować jak chcesz konkretie do takiej postacji

albo robisz funkcję CLR obsługującej .NET-owy format, albo zmudnie kleisz z elementów DATEPART potraktowanych CASTEM

select cast (datepart(yy,getdate()) as nvarchar(4)) + '_' + right('0' + cast (datepart(m,getdate()) as nvarchar(4)), 2)


MySQL - podobnie, tyle że masz inne funkcje http://dev.mysql.com/doc/refman/5.1/en/date-and-time-f...

ORACLE - funkcja TO_CHAR - http://www.techonthenet.com/oracle/functions/to_char.php
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Przemysław R.:
MSSQL - tu trzeba kombinować jak chcesz konkretie do takiej postacji

albo robisz funkcję CLR obsługującej .NET-owy format
I tłumaczę to potem komuś ;) ...
, albo zmudnie kleisz z elementów DATEPART potraktowanych CASTEM

select cast (datepart(yy,getdate()) as nvarchar(4)) + '_' + right('0' + cast (datepart(m,getdate()) as nvarchar(4)), 2)
No właśnie - komplikacja, że hej
Można też tak (bez dateparta):
right('00'+convert(varchar,month(data)),2)

ORACLE - funkcja TO_CHAR - http://www.techonthenet.com/oracle/functions/to_char.php
A to to bingo. Wiedziałem, że TO_CHAR jest, ale nie wiedziałem, że tyle może.

Czyli - ładne kosteczki z Accessa albo z Oracle'a ;)Wojciech Gardziński edytował(a) ten post dnia 12.01.10 o godzinie 14:36
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Kolejna ciekawostka:

Funkcja DIFFERENCE() w SQLS
Do porównywania tekstów, im teksty bardziej do siebie pasują względem jakiegoś tam ("fonetycznego"?) algorytmu, tym wartość większa - zwraca wartość 0-4.

ZASTOSOWANIE:
Szukamy czegoś w bazie, np. jakiejś nazwy kontrahenta. Nie pamiętamy jej literka po literce. Kojarzymy, że że coś z 'micro' i coś z 'soft' ma w nazwie...
(a z jakiś powodów nie chcemy lub nie możemy użyć '%','_')

To piszemy SQLka:
SELECT nazwa FROM faktura ORDER BY DIFFERENCE(nazwa,'micro soft') DESC
albo
SELECT nazwa FROM faktura WHERE DIFFERENCE(nazwa,'micro soft')>=3
Serio, działa (nawet ten algorytm niezgorszy).

Linki:
http://support.microsoft.com/kb/100365

http://oreilly.com/catalog/sqlnut/chapter/ch04.html
difference(character_expression, character_expression)
Compares how two arguments sound and returns a number from 0 to 4. Higher result indicates better phonetic match.Wojciech Gardziński edytował(a) ten post dnia 13.01.10 o godzinie 11:09
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

I... kolejna:

operator CUBE w SQLS:

Takie coś:
SELECT nazwa AS [Customer] , YEAR(data) AS [Year] , MONTH(data) AS [Month], SUM(wart_net) AS [Sales] ,GROUPING_ID(nazwa, YEAR(data), MONTH(data)) AS [GroupLevel] FROM TestDatabase.dbo.FAKTURA FAKTURA GROUP BY CUBE (nazwa, YEAR(data), MONTH(data)) ORDER BY GROUPING_ID(nazwa, YEAR(data), MONTH(data)) DESC,nazwa, YEAR(data), MONTH(data)

Daje takie coś:

CustomerYear Month Sales GroupLevel
662,8 7
1 145,2 6
2 66,5 6
3 123,9 6
4 164,3 6
5 42,6 6
6 19,8 6
7 21,2 6
8 44,4 6
9 13,6 6
10 5,8 6
11 4,5 6
12 11 6
2004 554,7 5
2005 108,1 5
2004 1 140 4
2004 2 41 4
2004 3 118,4 4
2004 4 153,9 4
2004 5 42,6 4
2004 6 15 4
2004 7 5 4
2004 8 3,9 4
2004 9 13,6 4
2004 10 5,8 4
2004 11 4,5 4
2004 12 11 4
2005 1 5,2 4
2005 2 25,5 4
2005 3 5,5 4
2005 4 10,4 4
2005 6 4,8 4
2005 7 16,2 4
2005 8 40,5 4
ANEX 5,5 3
AREX 140 3
BRONEX 83,6 3
CELIMP 19,4 3
DAREX 3,9 3
EDEX 30,7 3
EXIMP 15 3
FRANEX 11 3
GRZESIEX 4,5 3
HANIMPEX 5 3
IMPEX 40,5 3
JARIMPEX 118,4 3
JUREX 153,9 3
KOWALSKI 4,8 3
NOWAK 16,2 3
SIANEX 10,4 3
ANEX 3 5,5 2
AREX 1 140 2
BRONEX 2 41 2
BRONEX 5 42,6 2
CELIMP 9 13,6 2
CELIMP 10 5,8 2
DAREX 8 3,9 2
EDEX 1 5,2 2
EDEX 2 25,5 2
EXIMP 6 15 2
FRANEX 12 11 2
GRZESIEX 11 4,5 2
HANIMPEX 7 5 2
IMPEX 8 40,5 2
JARIMPEX 3 118,4 2
JUREX 4 153,9 2
KOWALSKI 6 4,8 2
NOWAK 7 16,2 2
SIANEX 4 10,4 2
ANEX 2005 5,5 1
AREX 2004 140 1
BRONEX 2004 83,6 1
CELIMP 2004 19,4 1
DAREX 2004 3,9 1
EDEX 2005 30,7 1
EXIMP 2004 15 1
FRANEX 2004 11 1
GRZESIEX 2004 4,5 1
HANIMPEX 2004 5 1
IMPEX 2005 40,5 1
JARIMPEX 2004 118,4 1
JUREX 2004 153,9 1
KOWALSKI 2005 4,8 1
NOWAK 2005 16,2 1
SIANEX 2005 10,4 1
ANEX 2005 3 5,5 0
AREX 2004 1 140 0
BRONEX 2004 2 41 0
BRONEX 2004 5 42,6 0
CELIMP 2004 9 13,6 0
CELIMP 2004 10 5,8 0
DAREX 2004 8 3,9 0
EDEX 2005 1 5,2 0
EDEX 2005 2 25,5 0
EXIMP 2004 6 15 0
FRANEX 2004 12 11 0
GRZESIEX 2004 11 4,5 0
HANIMPEX 2004 7 5 0
IMPEX 2005 8 40,5 0
JARIMPEX 2004 3 118,4 0
JUREX 2004 4 153,9 0
KOWALSKI 2005 6 4,8 0
NOWAK 2005 7 16,2 0
SIANEX 2005 4 10,4 0


Wszystkie podsumowania częściowe naraz.
Ostatnia kolumna to "poziom podsumowania". Bajer, ale zastosowania nie znam. Tabela przestawna załatwia to lepiej, ale dobrze wiedzieć, że można to już załatwiać na niższym poziomie.Wojciech Gardziński edytował(a) ten post dnia 18.01.10 o godzinie 13:53
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

MySQL: Funkcja GROUP_CONCAT

Kolejna ciekawostka - tym razem rodem z MySQL - informacyjne łączenie tekstów elementów, tworzących grupę (podlegających grupowaniu) w jednym polu tekstowym.
(=nowa funkcja agregująca na polu tekstowym)

MIASTO     Klienci                               Sprzedaż
WROCLAW JARIMPEX,SIANEX,HANIMPEX,AREX,FRANEX 284,8
WARSZAWA JUREX,KOWALSKI,IMPEX 199,2
OPOLE BRONEX,DAREX 87,5
LEGNICA EDEX,EXIMP 45,7
SZCZECIN CELIMP 19,4
BIALYSTOK NOWAK 16,2
CIECHANOW ANEX 5,5
GDANSK GRZESIEX 4,5


I, oczywiście, SQLek:

SELECT odbiorca_0.MIASTO, GROUP_CONCAT(DISTINCT faktura_0.NAZWA) AS 'Klienci', Sum(faktura_0.WART_NET) AS 'Sprzedaż'
FROM afin_Sales.faktura faktura_0, afin_Sales.odbiorca odbiorca_0
WHERE faktura_0.NAZWA = odbiorca_0.NAZWA
GROUP BY odbiorca_0.MIASTO
ORDER BY Sum(faktura_0.WART_NET) DESCWojciech Gardziński edytował(a) ten post dnia 01.06.10 o godzinie 12:55
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

CZYTANIE INFORMACJI ZAPISANEJ HIERARCHICZNIE

Jak przeczytać coś takiego SQLem?
F1	F2
Klucz1
Wart1
Wart2
Wart3
Klucz2
Wart1
Klucz3
Wart10
Wart11
Wart12
Wart13
Wart14
Wart15
Klucz153
Wart1234
Wart1235


żeby otrzymać taką tabelkę
KLUCZ	WARTOŚĆ
Klucz1 Wart1
Klucz1 Wart2
Klucz1 Wart3
Klucz2 Wart1
Klucz3 Wart10
Klucz3 Wart11
Klucz3 Wart12
Klucz3 Wart13
Klucz3 Wart14
Klucz3 Wart15
Klucz153 Wart1234
Klucz153 Wart1235


A jeżeli nie SQLem, to czym?
AFIN.NET.TextConverter da radę, ale mówimy o sytuacji, gdy go np. nie ma albo dane mają miliony wierszy i trudno to czytać linia-po-linii. I co wtedy?

Makro VBA to duża robota. Trzeba też sporo umieć, żeby je napisać. I makro, nawet najlepsze, i tak musi czytać linia-po-linii.

Ja się jednak uparłem, żeby SQLem.

Niemożliwe?
Do dzisiaj też tak myślałem.

Film:
http://afin.net/webcasts/Demo_SqlReadingTheHierarchica...Wojciech Gardziński edytował(a) ten post dnia 01.03.12 o godzinie 21:14
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Fajny SQLek w SQLS - generatorek kalendarza

WITH Generator AS 
(SELECT i=1
UNION ALL
SELECT i=i+1
FROM Generator
WHERE i<12)
SELECT FORMAT(2012+g1.i,'00') AS Year, FORMAT(g2.i,'00') AS Month
FROM Generator g1, Generator g2
ORDER BY g1.i,g2.i


Wynik:
2013 01
2013 02
2013 03
2013 04
2013 05
2013 06
2013 07
2013 08
2013 09
2013 10
2013 11
2013 12
2014 01
2014 02
2014 03
2014 04
2014 05
2014 06
2014 07
2014 08
2014 09
2014 10
2014 11
2014 12
2015 01
2015 02
itd. do 2024

lub wariacje, np.

Lista niedziel w najbliższych 100 dniach:
WITH Generator AS 
(SELECT i=GETDATE()
UNION ALL
SELECT i=i+1
FROM Generator
WHERE i<GETDATE()+100)
SELECT FORMAT(i,'yyyy-MM-dd') AS NextSundays
FROM Generator
WHERE FORMAT(i,'ddd')='Sun'
ORDER BY i


Wynik:
NextSundays
2013-08-25
2013-09-01
2013-09-08
2013-09-15
2013-09-22
2013-09-29
2013-10-06
2013-10-13
2013-10-20
2013-10-27
2013-11-03
2013-11-10
2013-11-17
2013-11-24Ten post został edytowany przez Autora dnia 21.08.13 o godzinie 17:40
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Im drożej, tym gorzej.
http://afin.net/webcasts/Other_SimpleSqlInExcelAccessS...
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Dzisiejszy odcinek nie przedstawia ani czegoś nowego, ani rewolucyjnego, ani czegoś, czego nie znaliby specjaliści od SQL - dzisiejszy SQLek ma pokazać, że MOŻNA w SQLku liczyć coś przy okazji, niejako, "na boczku", potem dołączać do danych głównych, a potem, jeszcze, filtrować dane główne według tego, co policzyliśmy sobie na boczku.

AFIN.NET SQL Editor - Direct Queries

ConnStr:
Driver={Microsoft Excel Driver (*.xls)};
DBQ=[AFIN.NET.Folder]\Samples\Data\ODBC\SalesInExcel.xls

SQL:
SELECT b.nr_fakt, b.nazwa, b.wart_net,
c.wart_net AS [Suma wart_net], b.wart_net/c.wart_net AS [Procent]
FROM [faktura$] b
LEFT JOIN (
SELECT c.nazwa, SUM(c.wart_net) AS wart_net
FROM [faktura$] c
GROUP BY c.nazwa
) AS c
ON c.nazwa=b.nazwa
WHERE b.wart_net<>c.wart_net

Tabela wynikowa:
nr_fakt nazwa wart_net Suma Wart_net Procent
04/2 BRONEX 41,00 83,60 49%
04/5 BRONEX 42,60 83,60 51%
04/9 CELIMP 13,60 19,40 70%
04/10 CELIMP 5,80 19,40 30%
04/13 EDEX 5,20 30,70 17%
04/14 EDEX 25,50 30,70 83%


Czyli, po polsku:
Weź faktury (i nazwy) klientów, ale tylko takich, co mieli wiele dokumentów sprzedaży i podaj wartość sprzedaży dla każdego dokumentu, obok wartość całej sprzedaży dla danego klienta oraz policz procent, jaki stanowi dana faktura w całej sprzedaży dla danego klienta.
Kupa roboty - jeden SQLek.

Wystarczy uruchomić AFINA (może być demo), otworzyć szablon "Edytor SQL", przekopiować tylko SQLek i natychmiast podziwiać żywy efekt.Ten post został edytowany przez Autora dnia 03.12.13 o godzinie 11:45
Stefan Trygiel

Stefan Trygiel Analityk Finansowy,
KLIMEX

Temat: SQL - ciekawostki

Wojciech G.:
Dzisiejszy odcinek nie przedstawia ani czegoś nowego, ani rewolucyjnego,

w przeciwieństwie do poprzednich odcinków :-)

Wystarczy uruchomić AFINA (może być demo), otworzyć szablon "Edytor SQL", przekopiować tylko SQLek i natychmiast podziwiać żywy efekt.

a jakżeby inaczej... Ten post został edytowany przez Autora dnia 03.12.13 o godzinie 11:58
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Kolejne cóś fajnego
Łączenie danych Z WIELOMA NIEKOMPLETNYMI SŁOWNIKAMI

mamy takie tabelki - 1. jakieś dane, 2.-4. niekompletne słowniki (1. jest kompletny, w 2. brakuje Adama, w 3. brakuje Adama i Peli)
Jak to połączyć z danymi?

Arkusz1:
Imie MiaraWzrost
Adam 180
Józek 185
Ela 175
Kasia 165
Pela 160

Slownik1:
Imie Cecha1Plec
Adam M
Józek M
Ela K
Kasia K
Pela K

Slownik2:
Imie Cecha2Miasto
Józek Warszawa
Ela Elbląg
Kasia Warszawa
Pela Wąchock

Slownik3:
Imie Cecha3KolorWlosow
Józek blond
Ela blond
Kasia rudy


SQLowcy wiedzą, że LEFT JOINem i, oczywiście, dobrze wiedzą.
Ale problem jest taki, że analitycy SQLa nie znają i trzeba im go WYTŁUMACZYĆ, a, w tym przypadku (uwaga: rzadko narzekam na MS Query!) MS Query jest bezsilne, bo potrafi zrobić sprzężenie jednostronne tylko JEDNOKROTNIE w ramach jednej kwerendy.

Więc... poznajmy składnię SQL dla wielokrotnych LEFT JOINów!

AFIN.NET SQL Editor - Direct Queries

ConnStr:
Driver={Microsoft Excel Driver (*.xls)};
DBQ=D:\AFIN\Proby\SQL\LeftJoin2Slowniki\Zeszyt1.xls

SQL:
SELECT dane.*, s1.Cecha1Plec, s2.Cecha2Miasto, s3.Cecha3KolorWlosow
FROM
(([Arkusz1$] dane
LEFT JOIN [Slownik1$] s1 ON dane.imie=s1.imie
) LEFT JOIN [Slownik2$] s2 ON dane.imie=s2.imie
) LEFT JOIN [Slownik3$] s3 ON dane.imie=s3.imie

Tabela wynikowa:
Imie MiaraWzrost Cecha1Plec Cecha2Miasto Cecha3KolorWlosow
Adam 180 M #N/D! #N/D!
Józek 185 M Warszawa blond
Ela 175 K Elbląg blond
Kasia 165 K Warszawa rudy
Pela 160 K Wąchock #N/D!

(To, oczywiście, w Excelku jest równą tabelką.)

Ważne jest to:
FROM 
(([Arkusz1$] dane
LEFT JOIN [Slownik1$] s1 ON dane.imie=s1.imie
) LEFT JOIN [Slownik2$] s2 ON dane.imie=s2.imie
) LEFT JOIN [Slownik3$] s3 ON dane.imie=s3.imie


Tutaj połączenie najbardziej wewnętrzne - dołączenie 1. słownika
FROM  
...([Arkusz1$] dane
LEFT JOIN [Slownik1$] s1 ON dane.imie=s1.imie
)

Nazwijmy je [TABELA1], czyli "dane po dołączeniu pierwszego słownika"

Tu połączenie 2.
FROM 
([TABELA1]
LEFT JOIN [Slownik2$] s2 ON dane.imie=s2.imie
)

Nazwijmy je [TABELA2], czyli "dane po dołączeniu pierwszego i drugiego słownika"

I, na końcu:
FROM 
[TABELA2]
LEFT JOIN [Slownik3$] s3 ON dane.imie=s3.imie


Otrzymujemy tabelę danych, połączoną z trzema słownikami naraz!

Pozostaje już tylko wybrać, co chcemy:
SELECT dane.*, s1.Cecha1Plec, s2.Cecha2Miasto, s3.Cecha3KolorWlosow

i gotowe.

Miłego SQLowania!Ten post został edytowany przez Autora dnia 05.12.13 o godzinie 14:57
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Rozwinięcie poprzedniego.
Jak wyczaić różnice w dwóch listach?

Mamy dwie tabelki (listy czegoś tam) - w jednej jest ekstra-Pela, w drugiej jest ekstra-Olek:

Lista1 ("Imie" to nazwa pola/kolumny):
Imie
Adam
Józek
Ela
Kasia
Pela

Lista2 ("Imie" to nazwa pola/kolumny):
Imie
Adam
Józek
Ela
Kasia
Olek


Jak się dowiedzieć, czego (których pozycji) w której tabeli nie ma, czyli PORÓWNANIE LIST DANYCH. Jednym eskjuelkiem, ofkołrs.

AFIN.NET SQL Editor - Direct Queries

ConnStr:
Driver={Microsoft Excel Driver (*.xls)};
DBQ=D:\AFIN\Proby\SQL\LeftJoin2SlownikiZeszyt2.xls

SQL:
SELECT a1.imie AS imie1, a2.imie AS imie2
FROM (
(SELECT imie FROM [Arkusz1$]
UNION
SELECT imie FROM [Arkusz2$])
AS lista
LEFT JOIN [Arkusz1$] AS a1 ON lista.imie=a1.imie
) LEFT JOIN [Arkusz2$] AS a2 ON lista.imie=a2.imie
WHERE a1.imie IS NULL OR a2.imie IS NULL

Tabela wynikowa:
imie1 imie2
#N/D! Olek
Pela #N/D!


Zwróćcie uwagę, że z głównej "tabeli" tego działania, czyli z tabeli tymczasowej 'lista'

(SELECT imie FROM [Arkusz1$]
UNION
SELECT imie FROM [Arkusz2$])
AS lista

(połączenie list 1. i 2. w jedną listę unikatową)

...nic mnie nie interesuje - w tabeli wynikowej nie ma żadnego pola z tabeli 'lista'.
Fajne, no nie?Ten post został edytowany przez Autora dnia 06.12.13 o godzinie 09:50
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Inspiracja: student EXC3, http://exc.ue.wroc.pl

No to pojedziemy dzisiaj po SQL Server-ze. Poczytajcie sobie grupy SQL Serwerowców, jak to pobrać dane z SQLS, albo wsadzić dane do SQLS, to jakiś dla nich problem jest...
(I, rzeczywiście, jest. Te wszystkie, podawane tam sposoby, u mnie na kompie nie działają. bo mam Excele 32-bit, a SQLS 64-bit. I KICHA. Serio, kicha, dziesiątki prób.)

Ale od czego jest ADO, uruchamiane z Excela?!
Driver={Microsoft Access Driver (*.mdb)}; DBQ=D:\AFIN\AFIN.NET\Samples\Data\ODBC\SalesInAccess.mdb

SELECT * INTO
[ODBC;DRIVER=SQL Server Native Client 11.0; SERVER=.\SQLEXPRESS; UID=admin; Trusted_Connection=Yes; APP=Microsoft Office 2013; WSID=AFIN7;DATABASE=Test].[SzerokaTabelaMoja]
FROM
[ODBC;DRIVER=SQL Server Native Client 11.0; SERVER=AFIN7\SQLS2012BI; UID=admin; Trusted_Connection=Yes; WSID=AFIN7;DATABASE=AfinSales;].[Region] region,
[ODBC;DRIVER=SQL Server Native Client 11.0; SERVER=.\SQLEXPRESS; UID=admin; Trusted_Connection=Yes; APP=Microsoft Office 2013; WSID=AFIN7;DATABASE=Sprzedaz - KopiaSQL].[Odbiorca]
WHERE region.MIASTO=Odbiorca.miasto


Karkołomna ta konstrukcja – bierze dwie różne tabele z dwóch różnych (!) serwerów SQLS, łączy relację (!) i wsadza (!) do jednego z nich, ale do jeszcze innej (!) bazy SQLS. Na sterowniku Accessowym, dostępnym na każdym kompie! (a tu, to, w ogóle, 100 wykrzykników)
Wszystko dzięki temu, że w Accessie jest (a w SQLS nie ma) „INTO IN”. Czad.Ten post został edytowany przez Autora dnia 12.06.14 o godzinie 07:16
Wojciech Gardziński

Wojciech Gardziński Mieć rację godzinę
wcześniej niż inni:
przez godzinę być
...

Temat: SQL - ciekawostki

Kolejna ciekawostka - jak przyporządkowywać dane do grup

Mamy takie dane (Arkusz: "dane"):
dane
405,0686212
43,40955799
395,6863834
150,984514
224,7835866
270,4731072
149,0944727
318,2575228
390,3216113
213,2106018
294,5892636
428,8781397


Robimy sobie prosty słownik np. w innym arkuszu Excelka (Arkusz: Slownik)
Do	grupa
100 gr1
200 gr2
300 gr3
1000 gr4


Robimy sobie (nie)prostą kwerendę:
(oczywiście wszystko do wyklikania myszkąmą w MS Query)
SELECT `dane$`.dane, Min(`slownik$`.Do) AS 'Min z Do', Min(`slownik$`.grupa) AS 'Min z grupa'
FROM `D:\AFIN\PROBY\SQL\PRZYPORZADKOWYWANIEDOGRUP\grupy1`.`dane$` `dane$`, `D:\AFIN\PROBY\SQL\PRZYPORZADKOWYWANIEDOGRUP\grupy1`.`slownik$` `slownik$`
WHERE `dane$`.dane <= `slownik$`.Do
GROUP BY `dane$`.dane


I uzyskujemy śliczny efekt, taki w sam raz dla tabeli przestawnej, nieprawdaż?:
dane	'Min z Do'	'Min z grupa'
43,41 100 gr1
149,09 200 gr2
150,98 200 gr2
213,21 300 gr3
224,78 300 gr3
270,47 300 gr3
294,59 300 gr3
318,26 1000 gr4
390,32 1000 gr4
395,69 1000 gr4
405,07 1000 gr4
428,88 1000 gr4


Pyk i jest. ZERO formułek Excelka.Ten post został edytowany przez Autora dnia 18.06.14 o godzinie 12:17

Następna dyskusja:

Kurs SQL




Wyślij zaproszenie do