Kamil Bęczyński

Kamil Bęczyński R, SAS, analizy

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Poprawiłem treść postu, gdyż rzeczywiście był mało czytelna, mam nadzieję, że teraz jest już lepiej.
Mam tabelę w której kolumna A zawiera zmienne jakościowe a1,a2,a3..., kolumna B zawiera zmienne jakościowe b1,b2,b3..., chcę stworzyć kwerendę która utworzy wynik widoczny jako kolumna C poniżej :
ID A B C
1 a1 b1 1
2 a1 b2 1
3 a2 b2 0
4 a2 b2 0
5 a3 b1 1
6 a3 b3 1
dla każdego z wierszy zawierającego a_i przyporządkowujemy wartość 1 w kolumnie C tylko w przypadku, gdy któryś z wierszy zawierających wartość a_i w kolumnie A zawiera co najmniej jedna wartość b1 w kolumnie B

Ten wynik chcę wykorzystać do wykonania podsumowania kolumny D - obliczyć sumy w grupach wyznaczonych przez poziomy zmiennej A, lecz tylko gdy C=1, w przeciwnym wypadku chcę otrzymać 0 lub (nie jestem w tej chwili pewien czy to możliwe) znak braku danych.

PozdrawiamKamil Bęczyński edytował(a) ten post dnia 24.06.11 o godzinie 20:47
Jarosław Kędzierski

Jarosław Kędzierski Admin od okienek

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Hej,

Przeczytałem 4 razy zanim zrozumiałem.
Jaki silnik bazodanowy chcesz do tego zaciągnąć ? ;>

To tak, podzapytanie, które wybierze A, dla których mają być jedynki

select distinct A from table where B=b1

podtem zjoinować do tego pierwotną tabelę i powinno dać wynik z 1-kami

select t.a,t.b,'1' from tabela t inner join (select distinct A from table where B=b1) ref

i teraz klauzulą union dołączyć te co nie mają b1.

select a,b,0 from table where a not in (select distinct A from table where B=b1)

Jakbym pamiętał klauzulę case, to spróbowałbym zapisać to w jednym zapytaniu, ale ani nie mam tu żadnego SQLowego kompilatora, ani specjalnie czasu przysiąść się na dłużejJarosław Kędzierski edytował(a) ten post dnia 24.06.11 o godzinie 17:09
Tomasz Zadora

Tomasz Zadora programuję

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Autor wątku pisze o kolumnach a nie tabelach, i z tego co zrozumiałem to wartości w *kolumnach* chce zapisywać w formacie: wartość,wartość,wartość (?).

Jeżeli tak to prawdopodobniej do rozwiązania problemu lepsze będzie podzielenie wartości na osobne kolumny lub stworzenie relacji "jeden-do-wielu".
Szymon P.

Szymon P. Databricks, Azure
Data Factory, MS SQL
SERVER

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

W najprostszym (ale niekoniecznie najbardziej wydajnym przypadku można to mniej więcej zrobić jak jarek proponował)

Czyli


create table Tabela2 (
ID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
Col_A varchar(50),
Col_B varchar(50),
Col_C bit DEFAULT 0,
COL_D decimal(18,2)
)

GO

INSERT INTO Tabela2 (Col_A, Col_B)
VALUES ('a1', 'b1'),
('a1', 'b2'),
('a2', 'b2'),
('a2', 'b2'),
('a3', 'b1'),
('a3', 'b1')
GO



0 - jest dafaultowo w kolumnie C

a później updatować C zapytaniem jak poniżej:



UPDATE Tabela2 SET COL_C = 1 WHERE Col_A IN (SELECT DISTINCT Col_A FROM Tabela2 WHERE Col_B = 'b1')



To Query jest takie najprostsze do zrozumienia, ale bardziej elegancko i pewenie bardziej wydajnie dla większych tabel posiadających indeksy można zrobić tak:



UPDATE Tabela2 SET Col_C = 1
FROM
Tabela2 inner join (select distinct Col_A FROM Tabela2 WHERE Col_B = 'b1') DerrivedTable
on Tabela2.Col_A = DerrivedTable.Col_A



Rozwiązanie prezentowane dla SQL Servera (w Accessie kod tez powinien działać), na Oracle'u trzeba zmienic typy danych Szymon P. edytował(a) ten post dnia 25.06.11 o godzinie 11:38
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Na szybko.

Jeżeli nie potrzebujesz tych wierszy, gdzie będziesz miał 0 w kolumnie C:

SELECT t1.A, t1.B, count(*)
FROM tabela t1, tabela t2
WHERE t1.A = t2.A
AND t2.B = 'b1'
GROUP BY t1.A, t1.B


Jeżeli potrzebujesz wiersze z 0 w kolumnie C:

SELECT t1.A, t1.B, count(*)
FROM tabela t1 LEFT JOIN tabela t2 ON t1.A = t2.A and t2.B = 'b1'
GROUP BY t1.A, t1.B


Mam nadzieje, że o to chodziło...
Później sumowanie nie powinno być problemem (jeżeli dobrze zrozumiałem) np :

SELECT sum(col_a)
FROM(
SELECT t1.A as col_a, t1.B as col_b, count(*)
FROM tabela t1, tabela t2
WHERE t1.A = t2.A
AND t2.B = 'b1'
GROUP BY t1.A, t1.B)


Edit:
Nie wiadomo jaki RDBMS - nie wiem, czy wszędzie chodzi "," jako złączenie. Jeżeli nie to ten pierwszy i trzeci przypadek będzie wyglądać tak:


SELECT t1.A, t1.B, count(*)
FROM tabela t1 INNER JOIN tabela t2 ON t1.A = t2.A AND t2.B = 'b1'
GROUP BY t1.A, t1.B
Grzegorz Drzymała edytował(a) ten post dnia 24.06.11 o godzinie 20:21

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Jak pada słowo 'kwerenda' to najpewniej mssql.
Kamil Bęczyński

Kamil Bęczyński R, SAS, analizy

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Trochę się pogubiłem, zadam więc prostsze pytanie :
ID A B D
1 a1 1 1
2 a2 1 2
3 a2 1 2
4 a3 1 2
5 a3 1 2
6 a4 1 1
chcę w wyniku użycia kwerendy otrzymać tabelę z kolumną D , będzie ona miała tyle wierszy co powyższa tabela i każdy wiersz będzie zawierać sumę tych wartości z kolumny B dla których w kolumnie A występują te same wartości co w kolumnie A danego wiersza.

konto usunięte

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Rafał Ciepiela:
Jak pada słowo 'kwerenda' to najpewniej mssql.

Access jak już

w MSSQL-u nie ma problemu żeby to zrobić
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Kamil Bęczyński:
Trochę się pogubiłem, zadam więc prostsze pytanie :
ID A B D
1 a1 1 1
2 a2 1 2
3 a2 1 2
4 a3 1 2
5 a3 1 2
6 a4 1 1
chcę w wyniku użycia kwerendy otrzymać tabelę z kolumną D , będzie ona miała tyle wierszy co powyższa tabela i każdy wiersz będzie zawierać sumę tych wartości z kolumny B dla których w kolumnie A występują te same wartości co w kolumnie A danego wiersza.

Tak?

Przygotowanie tabeli:

SQL> create table tabela2(id number, A varchar2(2), B number);
SQL> insert into tabela2 values(1, 'a1',1);
SQL> insert into tabela2 values(2, 'a2',1);
SQL> insert into tabela2 values(3, 'a2',1);
SQL> insert into tabela2 values(4, 'a3',1);
SQL> insert into tabela2 values(5, 'a3',1);
SQL> insert into tabela2 values(6, 'a4',1);
SQL> commit;


Zapytanie:

SQL> select t1.id, t1.A, t1.B, count(t2.B) as D
2 from tabela2 t1, tabela2 t2
3 where t1.A=t2.A
4 group by t1.id, t1.A, t1.B
5 order by id asc;


Wynik:

ID A B D
---------- -- ---------- ----------
1 a1 1 1
2 a2 1 2
3 a2 1 2
4 a3 1 2
5 a3 1 2
6 a4 1 1
Szymon P.

Szymon P. Databricks, Azure
Data Factory, MS SQL
SERVER

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Kamil Bęczyński:
Trochę się pogubiłem, zadam więc prostsze pytanie :
ID A B D
1 a1 1 1
2 a2 1 2
3 a2 1 2
4 a3 1 2
5 a3 1 2
6 a4 1 1
chcę w wyniku użycia kwerendy otrzymać tabelę z kolumną D , będzie ona miała tyle wierszy co powyższa tabela i każdy wiersz będzie zawierać sumę tych wartości z kolumny B dla których w kolumnie A występują te same wartości co w kolumnie A danego wiersza.

Że o co chodzi z tą kolumną D ? Generalnie jest prosta zasada adekwatna do każdego forum. Im klarowniej wyjaśnisz, tym szybciej Ci pomogą ;)Szymon P. edytował(a) ten post dnia 25.06.11 o godzinie 11:48
Kamil Bęczyński

Kamil Bęczyński R, SAS, analizy

Temat: Ciekawa kwerenda nie wiem jak ją zapisać

Dziękuję wszystkim za pomoc, moje pytanie jest już nieaktualne.



Wyślij zaproszenie do