Tablo B'deki tarih aralığına göre bir alanı döndürme, yani > = tablo A'daki tarih aralığı

0

Soru

Bir satırı 'yyyy-MMM' biçimlendirilmiş tarihlere dayanan sütunlara döndürmeye çalışıyorum ve bu, geçerli bir aylık dönem için beklendiği gibi çalışsa da, gelecek aylar için çalışamıyor ve bunu nasıl düzelteceğimi anlayamıyorum ve bu konuda herhangi bir geri bildirim için çok minnettar olurum.

İşte biraz arka plan: Sözleşme türü, miktar, parti numarası, 'yyyy-MMM' olarak biçimlendirilmiş oluşturma tarihi gibi bir sözleşme hakkında bilgi içeren bir Satıcı özet tablosundan gelen miktarı satın aldım, çünkü gerçek tarih bu amaç için önemli değil.

Kalan Miktar, esasen parti numarasına göre her türlü girişi toplayan bir kalem defteri giriş tablosundan gelen başka bir alandır.

Tüketilen Miktar, tüketildiği aya göre döndürmeye çalıştığım şeydir ve ayrıca bir giriş türü filtresine sahip öğe defteri girdilerinden geliyor

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

SONUÇ (Sadece kısmen gösteriliyor):

enter image description here

Gördüğünüz gibi, ikinci ABC Teknoloji kaydı 2021-Ekim'de bir tüketim gösteriyor ki bu doğru, ancak 2021-Ekim'de de satın alınan sözleşmeli miktara ve bu kayıtta kalanlara göre, tüketimin 9,373 olması ve 2021-Ekim'de doğru olarak görüntülediği 8,990'a kıyasla kısa (383) olması gerekiyor. Bu durumda 383 gerçek tüketimi 2021-Kasım'da düşüyor, ancak kodum bunu almıyor gibi görünüyor.

Bu, her iki Zebra technologies kaydında da tam olarak geçerlidir, burada kalan 0'dır, bu da tamamen tüketildiği anlamına gelir, ancak her ikisi için de satın alma sözleşmesi tarihleri 2021-Eylül'de olduğundan ve tüketim gelecek ay 2021-Ekim'de olduğundan, SQL betiği bunu almaz.

Bunu düzeltmeye yardımcı olacak herhangi bir rehberlik için minnettar olurum ve şimdiden teşekkürler.

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

En iyi cevabı

0

Vs'ye göre dönüyorsunuz.[Tarih], Lotun ne zaman satın alındığı, ne zaman tüketildiği değil. Son üç sütun, yalnızca öğeler aynı ay içinde satın alındığında ve tüketildiğinde sayıları gösterir.

Tüm veri kümesini döndürmek yerine, pivotu üçüncü alt sorguya taşıyın. Bu, önce Contracted_Qty ve Remaining_Qty dahil olmak üzere Lot ayrıntılarını alarak sorguyu basitleştirir ve ardından üç ay boyunca Lot tarafından döndürülen Consumed_Qty kümesi olan üçüncü alt sorguya katılır.

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_]
;

Bu sorguyu veri olmadan test edemiyorum ama çok yakın olmalı.

2021-11-23 20:47:23

Teşekkür için senin yanıt. TOPLAMI(kalan) kullanmamın nedeni, kalem defteri giriş tablosunun birden çok giriş türü, satın alma, ayarlamalar, tüketim olmasıdır. Her lot numarası için tüm giriş türlerinin toplamı, kalan miktara ulaşmamı sağlayan şeydir ve lot envanter defterime bağlanır. ancak, şimdi CQ kullandığımda.Pivottaki tarih ve cq'daki >= tarih birleşimini kaldırın, şimdi her ayın tüketimine ilişkin satın alma kaydını çoğaltır ve satın alınan toplamı lotla yanlış yapar. sorunumu daha iyi açıklamaya yardımcı olmak için başka hangi verileri sağlayabilirim? zaman ayırdığınız için çok teşekkür ederim ve bu konuda yardımcı olun
Vic

Bir sonraki ayarlama, pivotu üçüncü alt sorguya taşımak olacaktır. Tüm veri kümesini döndürmek yerine, Contracted_Qty ve Remaining_Qty dahil olmak üzere Lot ayrıntılarını alın ve ardından Consumed_qty'nin üç ay boyunca Lot tarafından döndürülen kümesi olan üçüncü alt sorguya katılın.
RobertT

Hala bir miktar toplayarak kalan miktarı nasıl elde edebileceğinizi merak ediyorum. Göstermek için bazı örnek veriler sağlayabilir misiniz?
RobertT

Kalan miktarı boşver. Defter tablonuzun her sayıyı iki sütuna kaydetmesi gerektiğini fark ettim. Kalan Miktar, giriş türüne bağlı olarak pozitif veya negatif bir sayıdır. Bunu toplamak, kalan miktarı verecektir. Sütun adı beni şaşırttı.
RobertT

Evet bu doğru! Defter tablosu her girişi böyle kaydeder.
Vic

bu iyi bir fikir! Pivotu alt sorguya taşımayı deneyeceğim, ilk bölümde haklıydınız, pivotum tüketim tarihi yerine satın alma tarihine dayanıyordu ve daha sonra parti no'ya göre gruplandırdım. bu da sorunu çözmüş gibi görünüyordu. ama pivotu üçüncü alt sorguya taşıma fikrini seviyorum, sizi haberdar edeceğim! Teşekkürler
Vic

Cevap, yorumlardaki geri bildirimlere göre güncellenir
RobertT

Diğer dillerde

Bu sayfa diğer dillerde

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