none
Left Join Group in Linq c# 4.0 RRS feed

  • Domanda

  • Buongiorno a tutti,

    ho 4 tabelle in SQL SERVER costituite così: DDT, Details, Registrazione Detail Usciti tipo A, Registrazione detail Usciti tipo B (a e b sono delle modalità di uscita e contengono riferimento al rigo entrato e quanti pezzi sono usciti).

    Ho bisogno di sapere quanti pezzi ho in casa: quindi, devo sottrarre dal campo Qty della Tabella Details tutti i record presenti in (Registrazione detail Usciti tipo A + Registrazione detail Usciti tipo B)

    Ho costruito una query del tipo:

    select b.Number, b.DateDoc, bia.IdDetail, bia.Qta as entrati, bia.Codice, biac.Qty as uscitiTIPO_A, bias.Qty as uscitiTIPO_B
    from DDT b
    inner join Details bia on b.IdDDT = bia.IdDDT
    left join DetailOutA biac on bia.IdDetail = biac.IdDetail
    left join DetailOutB bias on bia.IdDetail = bias.IdDetail
    where b.IdCustomer = 100
    
    order by bia.IdDetail

    Ho inner join al primo step per prendere tutti i dettagli del documento.

    Poi ho messo left join perché potrei non aver ancora fatto uscire nulla dei pezzi entrati (quindi avrò null nel campo).

    Il mio obiettivo è avere una riga sola riferita all'IDDetail che dica pezzi entrati 1000 pezzi usciti 200.

    Quindi quando faccio left join dovrei avere già le qty raggruppate con i totali, in modo da sottrarre poi da quelli entrati

    Come posso modificare questo?

    grazie

    p.s. dimenticavo: sto cercando di farlo in sintassi LINQ , non SQL



    • Modificato duppino martedì 20 giugno 2017 09:11
    martedì 20 giugno 2017 08:58

Tutte le risposte

  • Ciao!

    Non so scrivere in LINQ, se può interessare una proposta in TSQL...mi sono costruito un piccolo ambiente sulla base dei dati che ci hai fornito...fatto di fretta, potrebbe contenere errori, facci sapere.

    create table ddt (IdDDT int,IdCustomer int, Number int,DateDoc date )
    create table Details (IdDDT int, IdDetail int, Qta int, codice int )
    create table DetailOutA (IdDetail int,Qty int)
    create table DetailOutB (IdDetail int,Qty int)
    
    insert into ddt values (1,100,1000,getdate());
    insert into Details values (1,200,50,50);
    insert into DetailOutA values (200, 30);
    insert into DetailOutA values (200, 55);
    insert into DetailOutB values (300, 70);
    
    select  bia.IdDetail, SUM(ISNULL(bia.Qta,0))-SUM(ISNULL(biac.Qty,0))-SUM(ISNULL(bias.Qty,0)) as QtaNetta, bia.Codice
    from DDT b
    inner join Details bia on b.IdDDT = bia.IdDDT
    left join DetailOutA biac on bia.IdDetail = biac.IdDetail
    left join DetailOutB bias on bia.IdDetail = bias.IdDetail
    where b.IdCustomer = 100
    group by bia.IdDetail, bia.Codice --per ogni IdDetail il codice è lo stesso?
    order by bia.IdDetail;
    
    --Ho inner join al primo step per prendere tutti i dettagli del documento.
    --Poi ho messo left join perché potrei non aver ancora fatto uscire nulla dei pezzi entrati (quindi avrò null nel campo).
    --Il mio obiettivo è avere una riga sola riferita all'IDDetail che dica pezzi entrati 1000 pezzi usciti 200.
    --Quindi quando faccio left join dovrei avere già le qty raggruppate con i totali, in modo da sottrarre poi da quelli entrati
    
    drop table ddt;
    drop table Details;
    drop table DetailOutA;
    drop table DetailOutB;

    mercoledì 21 giugno 2017 10:53
  • Grazie Luca, perfetto.. era quello che non capivo!

    Funziona in SQL MANAGEMENT.. ora mi tocca capire da qualcuno come girarlo in LINQ questo:

    select  bia.IdDetail, SUM(ISNULL(bia.Qta,0))-SUM(ISNULL(biac.Qty,0))-SUM(ISNULL(bias.Qty,0)) as QtaNetta, bia.Codice
    from DDT b
    inner join Details bia on b.IdDDT = bia.IdDDT
    left join DetailOutA biac on bia.IdDetail = biac.IdDetail
    left join DetailOutB bias on bia.IdDetail = bias.IdDetail
    where b.IdCustomer = 100
    group by bia.IdDetail, bia.Codice --per ogni IdDetail il codice è lo stesso?
    order by bia.IdDetail

    Speriamo che qualcuno legga.. primo step è fatto.

    grazie ancora..

    D.



    • Modificato duppino lunedì 26 giugno 2017 20:48
    mercoledì 21 giugno 2017 11:12