konto usunięte

Temat: Zapytanie SQL potrzebuje pomocy

O to zapytanie :

@PAR ?@D17|od|&od:REG=77470 @? PAR@
@PAR ?@D17|do|&do:REG=77470 @? PAR@

select DISTINCT id=1,Twr_Kod,Twr_Nazwa,CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR) AS [RW] ,CAST(b.TrN_TrNNumer AS VARCHAR) + '/' + b.TrN_TrNSeria + '/' + CAST(b.TrN_TrNRok AS VARCHAR) AS [PZ],b.TrN_DokumentObcy

FROM CDN.TwrKarty


JOIN CDN.TraElem ON Twr_GIDNumer = TrE_TwrNumer
JOIN CDN.TraNag as a ON a.TrN_GIDTyp=1616 AND a.TrN_GIDNumer=TrE_GIDNumer
JOIN CDN.Dostawy ON Twr_GIDNumer=Dst_TwrNumer
JOIN CDN.Atrybuty ON AtR_ObiNumer = Twr_GIDNumer AND AtR_ObiTyp = Twr_GIDTyp
JOIN CDN.AtrybutyKlasy ON AtR_AtkId = AtK_Id
JOIN CDN.TraSelem ON Dst_GIDNumer=TrS_DstNumer
JOIN CDN.TraNag as b ON b.TrN_GIDTyp=1489 AND b.TrN_GIDNumer=TrS_GIDNumer


WHERE AtK_Nazwa ='drut' AND a.trn_data3 >=??od and a.trn_data3<=??do ORDER BY CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR)



Chodzi mi o to że chcę pobrać numer PZ i numer FV towaru którego atrybut nazwy jest drut i który zszedł (czyli było RW na niego). Problem że PZ i RW są w tej samej tabeli TraNag więc zrobiłem to w ten sposób jak powyżej. Było by fajnie tylko problem jest w tym i pytanie od razu do was czy da się coś z tym zrobić . Jak wyślemy te zapytanie do SQL to otrzymamy taki wynik że podaje nam KOD TOWARU, NAZWĘ TOWARU,ilość na rw ,RW,PZ i dokument obcy PZ czyli nr FV. Problem w tym że niektóre rekordy są chyba nie potrzebne tzn wypisuje nam wszystkie dostawy czyli PZ i nr FV jakie były na towar :

Drut 123 40 12/w/10 jakiśpz jakiśnr FV
Drut 123 40 12/w/10 jakiśpz2 jakiśnr FV2
Drut 123 40 12/w/10 jakiśpz3 jakiśnr FV3
Drut 123 40 12/w/10 jakiśpz4 jakiśnr FV4

Nie pokazuje mi chyba dostawy(PZ) z którego pobrał towar(wg czy jest coś takiego czy po prostu wszystkie dostawy składają się na ilość w magazynie i RW nie pobiera z dostawy tylko normalnie z magazynu) tylko chyba wszystkie dostawy. Jak bym wywalił z zapytania a dokładnie z selectu ten aliast cały b to ok wyświetli mi tyle rekordów ile RW w tym czasie było na taki towar. Ale jak dodam ten alias d w select to poprostu tych rekordów jest więcej i do was pytanie czy da się jakoś pobrać dokłądnie z jakiej dostawy pobrał towar do RW i potem jak mamy dane dostawy tylko ID wystarczy to wyświetlić PZ i dokument obcy PZ.
Piotr Jesionek

Piotr Jesionek v-ce prezes w
Prospeo Sp. z o.o.

Temat: Zapytanie SQL potrzebuje pomocy

W wyniku Twojego zapytania w ogóle nie występuje numer dostawy, nie występuje również w warunku ograniczającym WHERE stąd nie rozumiem po co Ci w ogóle ten numer dostawy. Jeśli jest nie potrzebny to usuń z zapytania odwołania do tabel Dostawy i TraSElem.
Jeśli jest potrzebny to zapytanie jest skonstruowane źle. Aby wyświetlić z jakich dostaw składa się pozycja na fakturze należy użyć następującej referencji:
(...) join cdn.traselem on (...)
join cdn.dostawy on trs_dstnumer=dst_gidnumer

Jeśli chcesz wyświetlić numer dostawy na dokumencie to takie zapytanie spowoduje wielokrotne wyświetlenie tego samego dokumentu. Przykładowo jeśli na jednym dokumencie będą dwie pozycje i każda z tych pozycji składać się będzie z trzech dostaw to ten dokument zostanie wyświetlony w 6 rekordach.
Jeśli nie chcesz wyświetlać numeru dostawy ale z jakiegoś powodu chciałbyś się odnieść do niego w filtrze aby zawęzić wynik zapytania to powinieneś użyć wyrażenia EXISTS.

konto usunięte

Temat: Zapytanie SQL potrzebuje pomocy

Piotr Jesionek:
W wyniku Twojego zapytania w ogóle nie występuje numer dostawy, nie występuje również w warunku ograniczającym WHERE stąd nie rozumiem po co Ci w ogóle ten numer dostawy. Jeśli jest nie potrzebny to usuń z zapytania odwołania do tabel Dostawy i TraSElem.
Jeśli jest potrzebny to zapytanie jest skonstruowane źle. Aby wyświetlić z jakich dostaw składa się pozycja na fakturze należy użyć następującej referencji:
(...) join cdn.traselem on (...)
join cdn.dostawy on trs_dstnumer=dst_gidnumer

Jeśli chcesz wyświetlić numer dostawy na dokumencie to takie zapytanie spowoduje wielokrotne wyświetlenie tego samego dokumentu. Przykładowo jeśli na jednym dokumencie będą dwie pozycje i każda z tych pozycji składać się będzie z trzech dostaw to ten dokument zostanie wyświetlony w 6 rekordach.
Jeśli nie chcesz wyświetlać numeru dostawy ale z jakiegoś powodu chciałbyś się odnieść do niego w filtrze aby zawęzić wynik zapytania to powinieneś użyć wyrażenia EXISTS.


Dostawy mi są potrzebne do tego aby wyciągnąć po nich w aliasie numer PZ i dokument obcy na tym PZ. Chyba że jest jakieś inne obejście żeby to zrobić ?



@PAR ?@R(SELECT Id = 1, Kod = 'drut' UNION
SELECT Id = 2, Kod = 'elektrody' UNION
SELECT Id = 3, Kod = 'gaz' UNION
SELECT Id = 4, Kod = 'węgiel' UNION
SELECT Id = 5, Kod = 'farby' UNION
SELECT Id = 6, Kod = 'rozcieńczalniki'
SELECT Id = 12, Kod = 'grudzień')|ok|&ok:REG= @? PAR@
@PAR ?@D17|od|&od:REG=77465 @? PAR@
@PAR ?@D17|do|&do:REG=77465 @? PAR@


select DISTINCT id=1,Twr_Kod,Twr_Nazwa,TrE_Ilosc,TrE_JmZ,CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR) AS [RW],CAST(b.TrN_TrNNumer AS VARCHAR) + '/' + b.TrN_TrNSeria + '/' + CAST(b.TrN_TrNRok AS VARCHAR) AS [PZ],b.TrN_DokumentObcy

FROM CDN.TwrKarty

JOIN CDN.TraElem ON Twr_GIDNumer = TrE_TwrNumer
JOIN CDN.TraNag as a ON a.TrN_GIDTyp=1616 AND a.TrN_GIDNumer=TrE_GIDNumer
JOIN CDN.TraSelem ON a.TrN_GIDTyp=TrS_GIDTyp AND a.TrN_GIDNumer=TrS_GIDNumer
JOIN CDN.Dostawy ON Dst_GIDNumer=TrS_DstNumer
JOIN CDN.Atrybuty ON AtR_ObiNumer = Twr_GIDNumer AND AtR_ObiTyp = Twr_GIDTyp
JOIN CDN.AtrybutyKlasy ON AtR_AtkId = AtK_Id
JOIN CDN.TraSelem as c ON Dst_GIDNumer=c.TrS_DstNumer
JOIN CDN.TraNag as b ON b.TrN_GIDTyp=1489 AND b.TrN_GIDNumer=c.TrS_GIDNumer


WHERE AtK_Nazwa = ??_Q_RES2_ok AND a.trn_data3 >=??od and a.trn_data3<=??do ORDER BY CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR),Twr_Nazwa




EDIT :

Chodzi jak należy :



@PAR ?@R(SELECT Id = 1, Kod = 'drut' UNION
SELECT Id = 2, Kod = 'elektrody' UNION
SELECT Id = 3, Kod = 'gaz' UNION
SELECT Id = 4, Kod = 'węgiel' UNION
SELECT Id = 5, Kod = 'farby' UNION
SELECT Id = 6, Kod = 'rozcieńczalniki'
SELECT Id = 12, Kod = 'grudzień')|ok|&ok:REG= @? PAR@
@PAR ?@D17|od|&od:REG=77465 @? PAR@
@PAR ?@D17|do|&do:REG=77465 @? PAR@


select DISTINCT id=1,Twr_Kod,Twr_Nazwa,TrE_Ilosc,TrE_JmZ,CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR) AS [RW],CAST(b.TrN_TrNNumer AS VARCHAR) + '/' + b.TrN_TrNSeria + '/' + CAST(b.TrN_TrNRok AS VARCHAR) AS [PZ],b.TrN_DokumentObcy

FROM CDN.TwrKarty

JOIN CDN.TraElem ON Twr_GIDNumer = TrE_TwrNumer
JOIN CDN.TraNag as a ON a.TrN_GIDTyp=1616 AND a.TrN_GIDNumer=TrE_GIDNumer
JOIN CDN.TraSelem ON a.TrN_GIDTyp=TrS_GIDTyp AND a.TrN_GIDNumer=TrS_GIDNumer
JOIN CDN.Dostawy ON Dst_GIDNumer=TrS_DstNumer
JOIN CDN.Atrybuty ON AtR_ObiNumer = Twr_GIDNumer AND AtR_ObiTyp = Twr_GIDTyp
JOIN CDN.AtrybutyKlasy ON AtR_AtkId = AtK_Id
JOIN CDN.TraSelem as c ON Dst_GIDNumer=c.TrS_DstNumer
JOIN CDN.TraNag as b ON b.TrN_GIDTyp=1489 AND b.TrN_GIDNumer=c.TrS_GIDNumer AND Dst_TwrNumer = Twr_GIDNumer


WHERE AtK_Nazwa = ??_Q_RES2_ok AND a.trn_data3 >=??od and a.trn_data3<=??do ORDER BY CAST(a.TrN_TrNNumer AS VARCHAR) + '/' + a.TrN_TrNSeria + '/' + CAST(a.TrN_TrNRok AS VARCHAR),Twr_Nazwa


Aleks Tomczyk edytował(a) ten post dnia 05.02.13 o godzinie 13:15
Piotr Jesionek

Piotr Jesionek v-ce prezes w
Prospeo Sp. z o.o.

Temat: Zapytanie SQL potrzebuje pomocy

Może to powyżej chodzi ale tylko przy sprzyjających warunkach.
Przede wszystkim nie powinieneś wyświetlać tre_ilosc jeślli stosujesz distinct bo wystarczy że na fakturze mieć będziesz różne ilośći i już każdy rekord zostanie wyodrębiony w osobnej pozycji. Jeśli już to sumę z tej kolumny.
Druga sprawa że połączenia masz niekompletne. Gdyby zaptanie nie miało DISTINCT i chciał to wyniki zapytania byłyby zwielokrotnione. W szczególności połączenie pomiędzy traElem i TraSElem powinno odnościć się również do GIDLp.
Nie rozumiem do końca po co używasz dwukrotnie traselem. Konstrukcja powinna być taka:
TraNag (faktura) - TraElem (pozycja faktury) - TwrKarty (kartoteka towarowa z tej faktury) - Atrybuty (wartość atrybutów dla tego towaru) - AtrybutyKlasy (rodzaj atrybutu - tutaj powinno być jeszcze wskazanie o który atrybut chodzi) - TraSelem [połączenie z TraElem] (referencje do dostaw z elementów faktur] - Dostawy - TraNag (dokument dostawy).

konto usunięte

Temat: Zapytanie SQL potrzebuje pomocy

Wiem już to zrobiłem. Wszystko chodzi bez problemów, uwzględniłem RW,RWK a po dostawach PZ oraz PW. Zapytanie zostało sprawdzone na kilku tysiącach różnych towarów i wszystko jak to powiedzieli jest "tiptop".

Dzięki Piotr za sugestie i pomoc
Emilia M.

Emilia M. Senior Brand
Manager, PTK
Centertel

Temat: Zapytanie SQL potrzebuje pomocy

Cześć
robiąc wstęp posiadam tabele skladajaca sie z 3 zmiennych :
ID_CLIENT - nr klienta w bazie
DATE - formt RRRRMM (rok mc)
PRODUCT ( w bazie mamy 5 produktów)

Fragment:
ID_CLIENT DATE PRODUCT
65890 201401 A4
1401 201401 A1
1402 201402 A4
345 201402 A2
34567 201402 A3
235 201401 A1
1401 201401 A4
1403 201403 A5
1401 201401 A3
48292 201403 A2

To co potrzebuje to wyciągnąć unikalnych klientów ( ID_Clienta) którzy w poszczególnych mc 2014 kupili kombinacje naszych produktów. Klient może wystąpić w danym mcu w ramach możliwych kombinacji tylko jeden raz.

Jesteście w stanie pomóc?
Piotr Kukuryk

Piotr Kukuryk Programista, Bank
Pekao S.A.

Temat: Zapytanie SQL potrzebuje pomocy

Cześć,


SELECT
ID_CLIENT
,DATE
,(SELECT (stuff((SELECT DISTINCT ',' + CONVERT(VARCHAR(50), inn.PRODUCT) FROM [dbo].[tabela] inn WHERE inn.ID_CLIENT = t.ID_CLIENT AND inn.DATE = t.DATE FOR XML PATH(''), TYPE, ROOT).value('root[1]','VARCHAR(50)'),1,1,''))) AS PRODUCTS
FROM [dbo].[tabela] t
GROUP BY ID_CLIENT, DATE

Wynik:

ID_CLIENT DATE PRODUCTS
235 201401 A1
345 201402 A2
1401 201401 A1,A3,A4
1402 201402 A4
1403 201403 A5
34567 201402 A3
48292 201403 A2
65890 201401 A4

Następna dyskusja:

Szkolenia z tworzenia rapor...




Wyślij zaproszenie do