Obrót pola na podstawie zakresu dat w tabeli B, który >= zakres dat w tabeli A

0

Pytanie

Próbuję przekonwertować ciąg w kolumny oparte na sformatowanych datach "dd-MMM", a mimo to działa, jak się spodziewano, w ciągu bieżącego miesiąca, to nie działa w ciągu nadchodzących miesięcy i nie mogę zrozumieć, jak to naprawić, i byłbym bardzo wdzięczny za wszelkie opinie na ten temat.

Oto trochę historii: Kupiłem ilość pochodzące z tabeli przestawnej dostawcy, który zawiera informacje o umowie, takie jak rodzaj umowy, ilość, numer partii, data utworzenia, sformatowana w "dd-MMM", ponieważ faktyczna data na ten cel nie ma znaczenia.

Pozostała ilość jest jeszcze jedno pole, wzięte z tabeli operacji książki towarów, która, w istocie, streszcza wszystkie rodzaje operacji na podstawie numeru partii.

Потребленное ilość-to jest to, co staram się toczyć na podstawie miesiąca, w którym zostało wydane, a także z zapisów książki towarów z filtrem typu rekordu

SELECT * 
FROM 
(
SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No', VS.[Date] AS 'Date', 
SUM(VS.Quantity) AS 'Contracted_Quantity',
SUM(CQ.Consumed_Qty*-1) AS 'Consumed_Qty',
SUM(RQ.Remaining_Qty) AS Remaining_Qty,
'Contract Type' = 
CASE 
  WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
  WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
  ELSE 'OTHERS'
  END 
FROM
(SELECT [Document No_],[Vendor No_],[Lot No_],FORMAT([Date Created], 'yyyy-MMM') AS 'Date'
      ,[Purch_ Contract No_],[Contract Type],[Quantity] FROM [A].[dbo].[Company$Volume Summary]) VS

/*to identify remaining quantity by lot (Lot no. is included in my VS alias statement)*/
LEFT JOIN (SELECT [Lot No_] ,SUM([Remaining Quantity]) AS Remaining_Qty FROM [A].[dbo].[Company$Item Ledger Entry]
  GROUP BY [Lot No_]) RQ on RQ.[Lot No_] = VS.[Lot No_]

/*to identify consumed volume, if consumption is in future month compared to purchase month, it doesn't populate, this is where I believe the problem is*/
LEFT JOIN (SELECT [Lot No_],FORMAT([Posting Date], 'yyyy-MMM') AS 'Date',SUM([Quantity]) AS Consumed_Qty
FROM [A].[dbo].[Company$Item Ledger Entry]
WHERE [Entry Type] = '5' 
GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')) CQ on CQ.[Lot No_] = VS.[Lot No_] and CQ.Date >= VS.[Date]

GROUP BY VS.[Vendor Name], FORMAT(VS.[Date Created],'yyyy-MMM'), PT.[Contract Type], VS.[Vendor No_]
) cs 
PIVOT
(
 SUM(Consumed_Qty)
  for Date in ([2021-Sep], [2021-Oct], [2021-Nov])
  ) pvt

WYNIK (pojawia się tylko częściowo):

enter image description here

Jak widać, drugi wpis technologii ABC pokazuje zużycie w 2021-październiku, co jest dokładne, jednak na podstawie tej kwoty kontraktowej, kupiony również w 2021-październiku, i tego, co zostało w tym wpisie, spożycie powinno wynosić 9 373 i mniej (383) w porównaniu z 8 990, które dokładnie pokazuje w 2021-październiku. W tym przypadku rzeczywiste zużycie 383 spada w 2021-listopadzie, jednak mój kod wygląda na to, tego nie odbiera.

Odnosi się to również do obu rejestrów Zebra technologies, gdzie pozostały wartość jest równa 0, co oznacza, że było ono w pełni wydane, jednak, ponieważ chcesz kontraktów na zakup dla obu z nich są wymienione w 2021-wrześniu, a spożycie-w przyszłym miesiącu 2021-październik, skrypt SQL tego nie uwzględnia.

Byłbym wdzięczny za wszelkie wskazówki, które pomogą rozwiązać ten problem, i z góry dziękuję.

pivot sql sql-server tsql
2021-11-22 22:40:04
1

Najlepsza odpowiedź

0

Odwracasz się na podstawie VS.[Data], czyli gdy Lot został zakupiony, a nie został wyczerpany. W ostatnich trzech kolumnach wyświetlane są tylko cyfry, gdy towary zostały zakupione I spożywane w JEDNYM i tym samym miesiącu.

Zamiast obracania całego zestawu danych, przenieś obrót w trzeci podzapytanie. Ułatwia to żądanie, otrzymując najpierw informacje o produkcie, w tym контракт_qty i оставшийся_qty, a następnie przystępując do trzeciej подзапросу, który stanowi podsumowanie zestaw потребляемых_qty w lotom za trzy miesiące.

SELECT VS.[Vendor Name], VS.[Vendor No_] AS 'Vendor_No',
VS.[Contracted_Quantity],
RQ.Remaining_Qty AS Remaining_Quantity,
'Contract Type' = 
CASE 
  WHEN VS.[Contract Type] = 1 THEN 'CONTRACT A'
  WHEN VS.[Contract Type] = 2 THEN 'CONTRACT B'
  ELSE 'OTHERS'
  END,
CQ.[2021-Sep], CQ.[2021-Oct], CQ.[2021-Nov]

FROM
    (
    /* List of Lots with details */
    SELECT 
        [Document No_],[Vendor No_],[Lot No_], [Purch_ Contract No_],[Contract Type],[Quantity] AS [Contracted_Quantity]
    FROM [A].[dbo].[Company$Volume Summary]
    ) VS

    /* Remaining Quantity for each Lot */
    LEFT JOIN (
        SELECT [Lot No_] , SUM([Remaining Quantity]) AS Remaining_Quantity 
        FROM [A].[dbo].[Company$Item Ledger Entry]
        GROUP BY [Lot No_]
        ) RQ on RQ.[Lot No_] = VS.[Lot No_]

    /* Consumed Quantity per Lot for three months*/
    LEFT JOIN (

        SELECT [Lot No_], [2021-Sep], [2021-Oct], [2021-Nov]
        FROM 
        (
        SELECT [Lot No_], FORMAT([Posting Date], 'yyyy-MMM') AS 'Date', SUM([Quantity]) AS Consumed_Qty
        FROM [A].[dbo].[Company$Item Ledger Entry]
        WHERE [Entry Type] = '5' 
        GROUP BY [Lot No_], Format([Posting Date], 'yyyy-MMM')
        ) AS src
        PIVOT
        (
         SUM(Consumed_Qty)
          for [Date] in ([2021-Sep], [2021-Oct], [2021-Nov])
          ) pvt

        ) CQ on CQ.[Lot No_] = VS.[Lot No_]
;

Nie mogę sprawdzić ten wniosek bez danych, ale musi być bardzo blisko.

2021-11-23 20:47:23

Dziękuję za odpowiedź. Powodem, dla którego używam KWOTĘ(pozostałą), polega na tym, że tabela księgi towarów zawiera kilka typów operacji: zakup, korekty, zużycie. Suma wszystkich typów rekordów dla każdego numeru partii-to jest to, co pozwala mi uzyskać pozostały ilość, i to naprawdę ma nic wspólnego z moją książką zapasów partii. jednak, gdy ja teraz używam CQ.Data w streszczeniu i usuń połączenie >= data w CQ, teraz powiela zapis o zakupie za każdy miesiąc konsumpcji, co sprawia, że łączną kwotę zakupów lotów nieregularnych. jakie dane mogę zapewnić, aby lepiej wyjaśnić swój problem? bardzo doceniam poświęcony czas i pomoc w tym
Vic

Następna korekta będzie polegać na przesunięciu osi trzeci podzapytanie. Zamiast obracać cały zestaw danych, uzyskać informacje o produkcie, w tym Contracted_Qty i Remaining_Qty, a następnie dołącz do trzeciej подзапросу, który jest zwinięty zestaw Consumed_Qty w lotom za trzy miesiące.
RobertT

Mnie nadal ciekawi, jak można uzyskać pozostały ilość, streszcza jakiś numer. Czy możesz podać jakieś przykłady danych do prezentacji?
RobertT

Nie zwracajcie uwagi na pozostałą ilość. Właśnie zdałem sobie sprawę, że w swojej księgowej tabeli każda liczba musi być zapisane w dwóch kolumnach. Liczba jest dodatnia lub ujemna, w zależności od typu rekordu. Podsumowanie tego da pozostałą ilość. Nazwa kolumny potrąciła mnie z tropu.
RobertT

Tak, to prawda! Tak właśnie jest w tabeli księgi głównej zapisywany jest każdy wpis.
Vic

to jest dobry pomysł! Spróbuję przenieść tabelę przestawną w podzapytanie, chociaż miałeś rację co do pierwszej części, miałem tabela przestawna, oparta na daty zakupu, a nie na daty spożycia, a następnie podzieliła ją na podstawie numeru partii. co wydawało się rozwiązało problem. ale podoba mi się pomysł przesunąć pręt trzeci podzapytanie, będę was informował na bieżąco! Dziękuję
Vic

Odpowiedź zaktualizowany w oparciu o opinie w komentarzach
RobertT

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................