Vraag


Acties:
  • 0 Henk 'm!

  • GerdaBoerna
  • Registratie: Augustus 2023
  • Laatst online: 15-11-2024
Ik heb een query gebouwd. Deze Query moet alle Productieorders laten zien, die aan de voorwaarde EmpID = '8888' voldoet. Daarnaast moeten de productieorders de klantnaam laten zien, die de Query uit CustomerAddres haalt. Echter heeft CustomerAddress meerdere adressen, en laat de Query, als de klant 4 adressen heeft 4 x de ProductieOrder zien.

Dit is waarschijnlijk een beginners fout, maar hoe kan ik er voor zorgen dat ik maar een ProdcutieOrder zie, met het eerste record uit CustomerAddress? Ik heb al geprobeerd met CustaddrCod > 1, maar het is een tekst veld, dus als ik die voorwaarde gebruik schiet de Query in de fout.

Ik gebruik Microsoft SEL Server ManagementStudio

Dit is de Query zoals ik hem gebouwd heb:
SELECT
PBO.ProdBOOStatusCode AS MFSStatus
, PS.Description
, PH.ProdStatusCode AS ProdStatus
, PBO.MachGrpCode
, PBOE.EmpId
, E.FirstName
, E.FullName
, PH.Dossiercode AS Productiedossier
, PH.ProdHeaderOrdNr AS Productieorder
, DM.OrdNr
, DM.CustId
, CA.Name
-- Klant naam
-- KLant nummer
, *
FROM
T_ProdBillOfOper AS PBO
, T_ProdBillOfOperEmployee AS PBOE
, T_Employee AS E
, T_Dossiermain AS DM
, T_ProductionHeader AS PH
, T_CustomerAddress AS CA
, T_ProdBOOStatus AS PS

WHERE
PBO.ProdHeaderDossierCode= PBOE.ProdHeaderDossierCode
and PH.ProdHeaderDossierCode = PBO.ProdHeaderDossierCode
and PH.DossierCode = DM.DossierCode
and PS.ProdBOOStatusCode = PBO.ProdBOOStatusCode
and PBOE.Empid = E.Empid
and CA.CustId= DM.Custid
-- and CA.CustAddrCode < 1
--and PBO.ProdHeaderDossierCode like '%PD24007639%'
and PBOE.Empid = 8888

Alle reacties


Acties:
  • 0 Henk 'm!

  • drdistortion
  • Registratie: Juli 2008
  • Laatst online: 12-09 14:08
Probeer eens
code:
1
and CAST(CA.CustAddrCode AS INT) < 1


En als dat niet werkt kun je het volgende proberen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
SELECT
PBO.ProdBOOStatusCode AS MFSStatus
, PS.Description
, PH.ProdStatusCode AS ProdStatus
, PBO.MachGrpCode
, PBOE.EmpId
, E.FirstName
, E.FullName
, PH.Dossiercode AS Productiedossier
, PH.ProdHeaderOrdNr AS Productieorder
, DM.OrdNr
, DM.CustId
, CA.Name
-- Klant naam
-- KLant nummer
, *
FROM
T_ProdBillOfOper AS PBO
, T_ProdBillOfOperEmployee AS PBOE
, T_Employee AS E
, T_Dossiermain AS DM
, T_ProductionHeader AS PH

, (SELECT *,row_number() over (partition by CustId order by CustAddrCode asc) AS RN from T_CustomerAddress) CA -- identificeert row numbers per CustId met sortering op CustAddrCode van laagste naar hoogste waarde

, T_ProdBOOStatus AS PS

WHERE
PBO.ProdHeaderDossierCode= PBOE.ProdHeaderDossierCode
and PH.ProdHeaderDossierCode = PBO.ProdHeaderDossierCode
and PH.DossierCode = DM.DossierCode
and PS.ProdBOOStatusCode = PBO.ProdBOOStatusCode
and PBOE.Empid = E.Empid
and CA.CustId= DM.Custid

and CA.RN = 1 -- selecteer per CustId de eerste regel

--and PBO.ProdHeaderDossierCode like '%PD24007639%'
and PBOE.Empid = 8888

[ Voor 106% gewijzigd door drdistortion op 31-10-2024 12:25 ]

8500Wp zuid 45°, Daikin 8kW hybride EHYHBX08AAV3


Acties:
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 13-09 10:17
waarschijnlijk is bovenstaand antwoord al je oplossing.
Als wil je waarschijnlijk het record met CustAddrCode = 1 en niet > 1 (dan krijg je er weer meer)

Maar voor vervolgvragen zou het al helpen als je ANSI joins tussen je tabellen maakt in plaats van impliciete joins.

Dan zie je in ieder geval snel of je alle joins compleet hebt en daar geen fout in zit, en het maakt je code voor ons een stuk leesbaarder

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SELECT
    PBO.ProdBOOStatusCode AS MFSStatus,
    PS.Description,
    PH.ProdStatusCode AS ProdStatus,
    PBO.MachGrpCode,
    PBOE.EmpId,
    E.FirstName,
    E.FullName,
    PH.Dossiercode AS Productiedossier,
    PH.ProdHeaderOrdNr AS Productieorder,
    DM.OrdNr,
    DM.CustId,
    CA.Name,
    -- Klant naam
    -- KLant nummer
    *
FROM
    T_ProdBillOfOper AS PBO
INNER JOIN
    T_ProdBillOfOperEmployee AS PBOE ON PBO.ProdHeaderDossierCode = PBOE.ProdHeaderDossierCode
INNER JOIN
    T_Employee AS E ON PBOE.Empid = E.Empid
INNER JOIN
    T_Dossiermain AS DM ON PH.DossierCode = DM.DossierCode
INNER JOIN
    T_ProductionHeader AS PH ON PH.ProdHeaderDossierCode = PBO.ProdHeaderDossierCode
INNER JOIN
    T_CustomerAddress AS CA ON CA.CustId = DM.Custid
INNER JOIN
    T_ProdBOOStatus AS PS ON PS.ProdBOOStatusCode = PBO.ProdBOOStatusCode
WHERE
    PBOE.Empid = 8888
    and CAST(CA.CustAddrCode AS CHAR) = "1"
    -- and PBO.ProdHeaderDossierCode like '%PD24007639%'

Acties:
  • 0 Henk 'm!

  • GerdaBoerna
  • Registratie: Augustus 2023
  • Laatst online: 15-11-2024
Thanx, zodra ik er weer mee aan de gang ga, laat ik weten of het is gelukt.

Acties:
  • 0 Henk 'm!

  • GerdaBoerna
  • Registratie: Augustus 2023
  • Laatst online: 15-11-2024
[quote]drdistortion schreef op donderdag 31 oktober 2024 @ 11:48:
Probeer eens
code:
1
and CAST(CA.CustAddrCode AS INT) < 1


Dit werkte niet omdat niet alle CustAddrCode getallen zijn, dit kunnen ook letters zijn. Dus ik krijg de volgende melding daarop: "Conversion failed when converting the nvarchar value 'POS1' to data type int."

Acties:
  • 0 Henk 'm!

  • GerdaBoerna
  • Registratie: Augustus 2023
  • Laatst online: 15-11-2024
[quote]dixet schreef op donderdag 31 oktober 2024 @ 15:44:
waarschijnlijk is bovenstaand antwoord al je oplossing.
Als wil je waarschijnlijk het record met CustAddrCode = 1 en niet > 1 (dan krijg je er weer meer)[qoute]

Dit werkt inderdaad ook niet omdat CustAddrCode allerlei getallen en cijfers kunnen zijn

Acties:
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 13-09 10:17
Hoe herken je dan "het eerste record uit CustomerAddress"? Wat is voor jou de eerste als het geen oplopend volgnummer is?

De tweede oplossing die @drdistortion geeft zou sowieso moeten werken, ook bij alfanumerieke velden. Heb je die al geprobeerd?
Die geeft - alfanumeriek gesorteerd - het eerste record.
Pagina: 1