PriceQuote तालिका, एक तिथि सीमा पर श्रेणी और मूल्य दें, हालांकि तिथि के लिए मान्य हमेशा एक बहुत बड़ी तिथि होती है।

priceQuote

दूसरी तालिका आइटम तालिका है, जो आइटम आईडी और उसकी श्रेणी को दिनांक के साथ देती है

Item Table

इसकी श्रेणी और तिथि के आधार पर इन दो तालिकाओं में शामिल होने का विचार है, उदाहरण के लिए, ITEMID ०५०३८४८२२०, श्रेणी १११७, दिनांक २०२०-०७-०२ को $७३० (राशि फ़ील्ड) वापस करना चाहिए।

नीचे मेरा प्रयास है, निश्चित रूप से यह काम नहीं करता जैसा मैं चाहता था कि यह काम करे

SELECT
Item.ItemID
,Item.Date
,ValidFROM
,ValidTo
,priceQuote.AMOUNT
From
Item
JOIN
priceQuote
on
Item.category=priceQuote.Category
and
Item.Date between ValidFROM and ValidTo

मुझे आश्चर्य है कि ऐसा करने का सबसे अच्छा तरीका क्या है (इन दो तालिकाओं पर विचार करना बहुत बड़ा है और इसमें दिनांक सीमा के साथ प्रदर्शन के मुद्दे शामिल हो सकते हैं)। यदि एसक्यूएल में शामिल होने का कोई अच्छा तरीका नहीं है, तो मैं अन्य समाधानों के लिए खुला हूं जैसे इन दो तालिकाओं को सी # एप्लिकेशन में लोड करना और सी # के माध्यम से गणना करना।

आपकी सहायता के लिए धन्यवाद।

डेटा का उदाहरण (सुनिश्चित नहीं है कि यहां एक्सेल फाइलें कैसे संलग्न करें):

+----------+-----------+------------+--------+
| Category | ValidFROM |  ValidTo   | AMOUNT |
+----------+-----------+------------+--------+
|     1113 | 4/1/2020  | 12/31/9999 |    665 |
|     1113 | 7/1/2020  | 12/31/9999 |    925 |
|     1113 | 5/10/2021 | 12/31/9999 |    491 |
|     1117 | 4/1/2020  | 12/31/9999 |    495 |
|     1117 | 7/1/2020  | 12/31/9999 |    730 |
|     1117 | 1/1/2021  | 12/31/9999 |    556 |
|     1117 | 5/10/2021 | 12/31/9999 |    555 |
+----------+-----------+------------+--------+

आइटम तालिका:

+-----------+----------+-----------+
|  ItemID   | category |   Date    |
+-----------+----------+-----------+
| 503848220 |     1117 | 7/2/2020  |
| 503848221 |     1117 | 7/2/2020  |
| 503848225 |     1117 | 7/3/2020  |
| 503848227 |     1117 | 7/6/2020  |
| 503848228 |     1117 | 7/6/2020  |
| 503848266 |     1113 | 6/26/2020 |
+-----------+----------+-----------+
1
Heisenberg 16 अगस्त 2021, 20:32

1 उत्तर

दिनांक प्रबंधन यहां वांछनीय से कम है और, आपकी मौजूदा डेटा संरचना को देखते हुए, मैं सवाल करता हूं कि क्या आपके कार्य को पूरा करने का एक निश्चित तरीका है, लेकिन नीचे मेरा प्रयास है।

मैंने अनुमान लगाया है कि आप आइटम दिनांक और आइटम आईडी दोनों के आधार पर फ़िल्टर करेंगे।

/* MOCK TABLES AND DATA */

DECLARE @Quote table (
    Category int, ValidFrom date, ValidTo date, Amount decimal(18,2)
);

DECLARE @Item table (
    ItemID varchar(10), Category int, [Date] date
);

INSERT INTO @Item ( ItemID, Category, [Date] ) VALUES
    ( '503848220', 1117, '7/2/2020' ),
    ( '503848221', 1117, '7/2/2020' ),
    ( '503848225', 1117, '7/3/2020' ),
    ( '503848227', 1117, '7/6/2020' ),
    ( '503848228', 1117, '7/6/2020' ),
    ( '503848266', 1113, '6/26/2020' );

INSERT INTO @Quote ( Category, ValidFrom, ValidTo, Amount ) VALUES
    ( 1113, '4/1/2020 ', '12/31/9999', 665 ),
    ( 1113, '7/1/2020 ', '12/31/9999', 925 ),
    ( 1113, '5/10/2021', '12/31/9999', 491 ),
    ( 1117, '4/1/2020 ', '12/31/9999', 495 ),
    ( 1117, '7/1/2020 ', '12/31/9999', 730 ),
    ( 1117, '1/1/2021 ', '12/31/9999', 556 ),
    ( 1117, '5/10/2021', '12/31/9999', 555 );

/*
    Return matching row based on an item's id and date
*/

SELECT
    *
FROM @Item AS i
LEFT JOIN @Quote AS q
    ON i.Category = q.Category
    AND MONTH( q.ValidFrom ) >= MONTH ( i.[Date] )
    AND YEAR ( i.[Date] ) <= YEAR ( q.ValidTo )
WHERE
    i.ItemID = '503848220'
    AND i.[Date] = '07/02/2020'
ORDER BY
    i.Category, i.[Date], q.ValidFrom, q.ValidTo;

रिटर्न

+-----------+----------+------------+----------+------------+------------+--------+
|  ItemID   | Category |    Date    | Category | ValidFrom  |  ValidTo   | Amount |
+-----------+----------+------------+----------+------------+------------+--------+
| 503848220 |     1117 | 2020-07-02 |     1117 | 2020-07-01 | 9999-12-31 | 730.00 |
+-----------+----------+------------+----------+------------+------------+--------+

यदि आप अपने डेटा को किसी विशिष्ट महीने तक सीमित रखना चाहते हैं तो आप बदल सकते हैं

AND MONTH( q.ValidFrom ) >= MONTH ( i.[Date] )

प्रति

AND MONTH( q.ValidFrom ) = MONTH ( i.[Date] )
1
Critical Error 16 अगस्त 2021, 20:04