मैं एक ऐसा दृश्य बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता प्रति "बैच" में एक पंक्ति देखता है ताकि जब विभिन्न तालिकाओं से "बैच" मेल हो जाए - तो उन्हें एक पंक्ति के रूप में एक साथ जाना चाहिए। लेकिन यदि किसी भी तालिका में "बैच" है तो इसे परिणाम में अन्य कॉलम में "नल" के साथ एक पंक्ति के रूप में भी जोड़ा जाना चाहिए।
मुझे लगता है कि समस्या यह है कि मैं टेबल में कैसे शामिल होता हूं। लेकिन मैं समस्या को ठीक से समझ नहीं पा रहा हूं।
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
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
मुझे लगता है कि मैं एक अलग दृष्टिकोण पसंद करूंगा। आप सभी बैचनंबर कैसे लेते हैं और सभी कॉलम खाली कॉलम के रूप में जोड़ते हैं। फिर आप प्रत्येक तालिका के विभिन्न स्तंभों को अद्यतन करते हैं।
इस कदर:
SELECT INTO #MyTableResult Batch FROM TableA
UNION
SELECT Batch FROM TableB
और इसी तरह। संघ ने डुप्लीकेट हटा दिए।
फिर आप इस तरह अपडेट करते हैं:
Update #MyTableResult SET Column A = ValueA FROM TableA WHERE
#MyTableResult.Batch = TableA.Batch.
आपके टेबल से सभी अपडेट हो जाने के बाद, आपको वांछित परिणाम मिलता है।
संबंधित सवाल
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।