मैं एक ऐसा दृश्य बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता प्रति "बैच" में एक पंक्ति देखता है ताकि जब विभिन्न तालिकाओं से "बैच" मेल हो जाए - तो उन्हें एक पंक्ति के रूप में एक साथ जाना चाहिए। लेकिन यदि किसी भी तालिका में "बैच" है तो इसे परिणाम में अन्य कॉलम में "नल" के साथ एक पंक्ति के रूप में भी जोड़ा जाना चाहिए।

मुझे लगता है कि समस्या यह है कि मैं टेबल में कैसे शामिल होता हूं। लेकिन मैं समस्या को ठीक से समझ नहीं पा रहा हूं।

CREATE TABLE #ItemTable ([Item] nvarchar(16))
CREATE TABLE #LocationTable ([Item] nvarchar(16), [Batch] nvarchar(32), [Location] nvarchar(13), [Quantity] int)
CREATE TABLE #OrderTable ([Item] nvarchar(16), [Batch] nvarchar(32), [Quantity] int)
CREATE TABLE #BookingTable ([Item] nvarchar(16), [Batch] nvarchar(32), [Quantity] int)

--------------------------------------------------------------------------------------------------
-- CURRENT RESULT:
--------------------------------------------------------------------------------------------------
--  Item    Batch   Location        QuantityOnLocation  OrderedQuantity BookedQuantity
--  1000    1       Location_1      10                  NULL            NULL
--  1000    22      Location_2      10                  NULL            NULL
--  2000    333     Location_3      0                   10              NULL
--  2000    4444    Location_4      10                  NULL            NULL
--  3000    666666  NULL            NULL                10              10

--------------------------------------------------------------------------------------------------
-- DESIRED RESULT:
--------------------------------------------------------------------------------------------------
--  Item    Batch   Location        QuantityOnLocation  OrderedQuantity BookedQuantity
--  1000    1       Location_1      10                  NULL            10
--  1000    22      Location_2      10                  NULL            0
--  1000    55555   NULL            NULL                NULL            10
--  2000    333     Location_3      0                   10              NULL
--  2000    4444    Location_4      10                  NULL            NULL
--  3000    666666  NULL            NULL                10              10


INSERT INTO #ItemTable ([Item]) VALUES 
('1000'), 
('2000'), 
('3000')

INSERT INTO #LocationTable ([Item], [Batch], [Location], [Quantity]) VALUES 
('1000', '1', 'Location_1', 10), 
('1000', '22', 'Location_2', 10), 
('2000', '333', 'Location_3', 0),
('2000', '4444', 'Location_4', 10)

INSERT INTO #OrderTable ([Item], [Batch], [Quantity]) VALUES 
('2000', '333', 10), 
('3000', '666666', 10)

INSERT INTO #BookingTable ([Item], [Batch], [Quantity]) VALUES 
('1000', '1', 10), 
('1000', '55555', 10), 
('3000', '666666', 10)


SELECT 
    [Item].[Item] AS [Item], 
    COALESCE([Location].[Batch], [Order].[Batch], [Booking].[Batch]) AS [Batch],
    [Location].[Location] AS [Location], 
    [Location].[Quantity] AS [QuantityOnLocation],
    [Order].[Quantity] AS [OrderedQuantity],
    [Booking].Quantity AS [BookedQuantity]
FROM 
    #ItemTable AS [Item]
    LEFT OUTER JOIN (
        SELECT [Item], [Quantity], [Batch], [Location]
        FROM #LocationTable)
    AS [Location] ON [Location].[Item] = [Item].[Item] 

    LEFT OUTER JOIN (
        SELECT [Item], [Quantity], [Batch]
        FROM #OrderTable) 
    AS [Order] ON [Order].[Item] = [Item].[Item] 
        AND ISNULL([Order].[Batch], '') = ISNULL([Location].[Batch], [Order].[Batch]) 

    LEFT OUTER JOIN (
        SELECT [Item], [Quantity], [Batch]
        FROM #BookingTable) 
    AS [Booking] ON [Order].[Item] = [Item].[Item]
        AND ISNULL([Booking].[Batch], '') = COALESCE([Location].[Batch], [Order].[Batch], [Booking].[Batch]) 
WHERE
    ISNULL([Location].[Quantity], 0) <> 0
    OR ISNULL([Order].[Quantity], 0) <> 0
    OR ISNULL([Booking].Quantity, 0) <> 0


DROP TABLE #ItemTable
DROP TABLE #LocationTable
DROP TABLE #BookingTable 
DROP TABLE #OrderTable
5
Danieboy 8 जिंदा 2018, 17:58

2 जवाब

मुझे आपके अंतिम कॉलम के तर्क के बारे में निश्चित नहीं है, लेकिन यह अन्य कॉलम के लिए वांछित परिणाम देता है।

बुकिंग या बैच के रूप में दिखने वाले स्थानों के आधार पर आपकी क्वेरी प्राप्त करने के लिए, मैंने क्वेरी में दो तालिकाओं को एक साथ जोड़ दिया है।

मैं सुझाव दूंगा, यदि संभव हो तो, अपने डेटा संरचना के डिजाइन पर दोबारा गौर करें

select 
    item.Item,
    batch.Batch, 
    max(batch.location) as location,
    sum(batch.LQuantity) as QuantityOnLocation,
    orders.Quantity as OrderedQuantity,
    sum(batch.BQuantity) as BookedQuantity
from
    #ItemTable item
        left join 
        (
            select Item, Batch, quantity as BQuantity, null as Location, null  as LQuantity from #BookingTable
            union
            select item, Batch, null, Location, Quantity as LQuantity from #LocationTable
        ) batch
            on item.Item = batch.Item
    left join #OrderTable orders
        on item.Item = orders.Item and batch.Batch = orders.Batch
group by 
    item.Item,
    batch.Batch,    
    orders.Quantity
1
podiluska 8 जिंदा 2018, 18:27

मुझे लगता है कि मैं एक अलग दृष्टिकोण पसंद करूंगा। आप सभी बैचनंबर कैसे लेते हैं और सभी कॉलम खाली कॉलम के रूप में जोड़ते हैं। फिर आप प्रत्येक तालिका के विभिन्न स्तंभों को अद्यतन करते हैं।

इस कदर:

SELECT INTO #MyTableResult Batch FROM TableA
UNION 
SELECT Batch FROM TableB

और इसी तरह। संघ ने डुप्लीकेट हटा दिए।

फिर आप इस तरह अपडेट करते हैं:

Update #MyTableResult SET Column A = ValueA FROM TableA WHERE 
#MyTableResult.Batch = TableA.Batch.

आपके टेबल से सभी अपडेट हो जाने के बाद, आपको वांछित परिणाम मिलता है।

-1
Zohar Peled 8 जिंदा 2018, 18:12