2010-02-08 11 views
6

मैं एक विचार है जो विभाजित किया जा सकता है और इस प्रकार के बारे में सोचा मॉडल करने के लिए की जरूरत है यहां समस्या यह है कि किताबों के लिए आपके पास कई कीमतें हो सकती हैं और इन कीमतों में बदलाव होने की संभावना है। यहां एक उदाहरण हैएक-कई रिश्ता भंडारण के लिए सबसे अच्छा तरीका व्यावहारिक उदाहरण/दुविधा

 
BookDetails: 
----------------- 
ID Name 
1 Harry Potter… 

यह काफी आसान है।

कहाँ इसे और अधिक दिलचस्प है कि मैं उस दिन दस अलग-अलग मूल्य हो सकता है यह एक पुस्तक के लिए, है जैसे:

 
BookPrices: 
------------------------------------ 
Book_Details_Id Kind   Price 
1    SpecialOffer  10 
1    BulkPurchase  20 
1    Normal   30 

मैं किताबें और स्तंभों में उनके सभी मूल्यों की एक सूची उपलब्ध कराने की आवश्यकता - कुछ जैसे:

 
BookName   SpecialOffer BulkPurchase  Normal  
Harry Potter…    10    20   30 

मेरा प्रश्न है: क्या पुस्तक मूल्य तालिका में वास्तव में कॉलम के रूप में सभी अलग-अलग मूल्य प्रकार होना चाहिए? मेरे लिए यह बदसूरत है और एक बेहतर विचार है कि प्रत्येक कीमत को

यदि मैं उस दृष्टिकोण का उपयोग करता हूं तो मैं परिणाम सेट उत्पन्न करने के लिए SQL क्वेरी के बारे में नहीं सोच सकता। मैं आज सुबह इस बारे में सोच रहा हूं।

संपादित करें: मुझे कीमतों की गणना करने पर कोई छूट नहीं है - उन्हें नीचे संग्रहीत करना होगा।

संपादित करें: - इसका क्या मैं वास्तव में मन में था

चयन book.bookid, bp1.price, किताब से bp2.price यह मूलतः 1-एन appraoch मैं के बारे में सोच (धन्यवाद नीचे टिप्पणी करने के लिए) कर सकते हैं जॉइन बुकप्रिस बीपी 1 जॉइन बुकप्रिस बीपी 2 ऑन बीपी 1.बुकिड = बुक.बुकिड और बीपी 1.pricetype = 1 और बीपी 2.बुकिड = बुक.बुकिड और बीपी 2.pricetype = 2 ...

समस्या दस कीमतों के लिए होगी दस बार जुड़ना जो बदबू आ रही है!

+0

क्या आप कृपया हमें बता सकते हैं कि आप जिस स्कीमा को विकसित कर रहे हैं उसके लिए विशिष्ट और ठोस आवश्यकताएं क्या हैं? कुछ प्रश्न: क्या आपको प्रति पुस्तक विशिष्ट मूल्यों की आवश्यकता है? क्या कई प्रकार के ऑफ़र होंगे? क्या ऑफर प्रकार अक्सर बदलते हैं? –

+0

मेरे पास इसका प्रतिनिधित्व करने के तरीके पर नियंत्रण है - मैं या तो 1-एन तालिका (जिसे मैं करना पसंद करता हूं) चुन सकता हूं, लेकिन मैं नहीं सोच सकता कि मैं एक पुस्तक के लिए कॉलम में सभी कीमतों को कैसे प्राप्त कर सकता हूं। विकल्प प्रत्येक तालिका प्रकार को तालिका में रखना है और 1-1 मैपिंग –

+1

है, तो आप "** PIVOT **" की क्षमता चाहते हैं, जो SQL सर्वर समर्थित नहीं है। SQL सर्वर उस तरह के कॉलम उत्पन्न नहीं कर सकता है। –

उत्तर

4

इस उत्तर टी एसक्यूएल विशिष्ट है, और एक छोटे से शोधन इस्तेमाल कर सकते हैं, लेकिन यह एसक्यूएल 2005

टिप्पणी हटाएं टिप्पणी की तर्ज पर काम करता है और यह जादू की तरह से अपडेट कर देंगे! (ठीक है, जादू नहीं है, लेकिन niftily hacky)

DROP TABLE Books 
DROP TABLE Prices 
DROP TABLE bookpricing 

CREATE TABLE Books (id INT, title VARCHAR(20)) 
CREATE TABLE Prices (id INT, [desc] VARCHAR(20), pricingchange VARCHAR(20)) 
CREATE TABLE bookpricing (id INT, bookid INT, priceid INT, bookprice MONEY) 

INSERT INTO Books VALUES (1, 'Hi Mom') 
--INSERT INTO Books Values (2, 'This is another book') 
INSERT INTO Prices VALUES (1, 'Standard', '1') 
INSERT INTO Prices VALUES (2, 'Discount', '.5') 
INSERT INTO Prices VALUES(3, 'HyperMarkup', '1.5') 
INSERT INTO prices VALUES(4, 'Remaindered', '.1') 

INSERT INTO BookPricing VALUES (1,1,1,20.00) 
INSERT INTO BookPricing VALUES (2,1,2,10.00) 
INSERT INTO BookPricing VALUES (3,1,3,30.00) 
--INSERT INTO BookPricing VALUES (4,2,1,30.00) 
--INSERT INTO BookPricing VALUES (5,2,2,15.00) 
--INSERT INTO BookPricing VALUES (6,2,4,3.00) 

SELECT * FROM bookpricing 

/** इस बिट http://www.tsqltutorials.com/pivot.php **/

DECLARE @columns VARCHAR(max) 

SELECT @columns = COALESCE(@columns + ',[' + cast(id as varchar) + ']', 
'[' + cast(id as varchar)+ ']') 
FROM prices 


DECLARE @query VARCHAR(max) 

SET @query = ' 
SELECT * FROM (SELECT BookID, PriceID, BookPrice FROM BookPricing) AS BookTable PIVOT (SUM(bookprice) FOR priceid 
IN (' + @columns + ') 
) 
AS p' 

EXECUTE(@query) 
+2

दुर्भाग्यवश किसी भी समय आपको अज्ञात मानों वाले कॉलम के अज्ञात सेट पर एक पिवट करने की आवश्यकता है, आपको गतिशील एसक्यूएल का उपयोग करना होगा। मेरी वरीयता है कि "व्यू बिल्डर" proc है जो मान लेता है पंक्तियों, पिवट टेबल में coalesces तो नए मूल्यों के आधार पर विचारों को छोड़ देता है/बनाता है। आप यहां क्या कर रहे हैं के समान ही, लेकिन अधिक व्यवस्थित। – jcollum

+0

यह काम करता है - बहुत अच्छा किया! –

5

कैसे इस

BookDetails 
BookID BookName 

BookPrice 
BookID PriceID PriceTypeID 

BookPriceType 
PriceTypeID DEscription 
+0

ठीक करने की क्षमता है ठीक है - क्या मुझे एक पुस्तक के लिए सभी कीमतें (यहां तक ​​कि अगर शून्य) दिखाने के लिए क्वेरी है? कठिन भाग –

+0

यह होमवर्क की तरह बहुत गंध करता है। – Tomalak

+2

यह निश्चित रूप से नहीं है - मेरा सवाल यह है कि मैं इसे 1-एन संबंध के रूप में कैसे प्रस्तुत कर सकता हूं और सभी कीमतों को बाहर कर सकता हूं क्योंकि COLUMNS –

0

आप कीमतों स्थिर संग्रहीत करना चाहते हैं (उदाहरण के लिए के बजाय उन्हें की गणना), एक 1-के-एन-संबंध का उपयोग करते हैं के बारे में:

तालिका 1 पंक्तियों के साथ: पंक्तियों के साथ आईडी शीर्षक प्रकाशक आदि

तालिका 2: BookID मूल्य

तालिका 2 से "बुकआईडी" तालिका 1 से "आईडी" इंगित करेगा, इस तरह आप जितनी चाहें उतनी कीमतें प्राप्त कर सकते हैं। एक विशिष्ट पुस्तक के लिए सभी कीमतों को पुनर्प्राप्त करने के लिए जॉइन (SQL- दस्तावेज़ देखें) का उपयोग करें।

यदि आप विशेष छूट प्रदान करते हैं (उदाहरण के लिए थोक खरीद 10% बंद है, लेकिन ग्राहक एक समय में 100 से अधिक वस्तुओं को खरीदता है तो 20% बंद), मैं इसे स्थिर रूप से संग्रहीत करने के बजाय कीमत को कम कर दूंगा।

+0

3 टेबल (जैसे अन्य उत्तरों में सुझाए गए) का उपयोग केवल तभी जरूरी है, यदि आप फिर से उपयोग करना चाहते हैं अन्य पुस्तकों के लिए कीमतें (एक मूल्य केवल एक बार संग्रहीत किया जाता है)। लेकिन अगर आप इसे संशोधित करते हैं तो आप सभी पुस्तकों के लिए उस विशिष्ट मूल्य को बदल देंगे। – Select0r

0

यह एक पुल तालिका जहां आप के लिए एक बुनियादी उपयोग मामला है:

पुस्तक जानकारी के लिए

1 टेबल
1 कीमत की जानकारी के लिए तालिका
1 पुल टेबल बुक के प्रत्येक उदाहरण के लिए एक साथ दो शामिल होने के लिए और मूल्य।

1

मुझे कई बार इस तरह की समस्या का सामना करना पड़ा है। जिस तरह से मैं इसे देखता हूं, क्या आप स्पष्ट रूप से एक पुस्तक का मॉडल कर सकते हैं। तो उदाहरण के लिए आपके पास 10 प्रकार की कीमतें हैं। क्या ये प्रकार स्थिर हैं? क्या वे कभी बदलते हैं? यदि वे नहीं बदलते हैं तो मैं उन्हें मूल्य निर्धारण में कॉलम के रूप में रखना पसंद करता हूं (इसे विवरण नहीं कहूंगा)। इसमें एक प्रभावी प्रारंभ तिथि और वैकल्पिक समाप्ति तिथि शामिल होगी। यह आपको समय से पहले स्टेजिंग मूल्य परिवर्तनों को संभालने देगा।

अब यदि आप अपने सौदों के साथ कीमतों के प्रकारों को नहीं जानते हैं। एक उदाहरण एक प्रणाली होगी जहां एक अंतिम उपयोगकर्ता (एक व्यवस्थापक उपयोगकर्ता सबसे अधिक संभावना) पुस्तकों और विभिन्न प्रकार की कीमतों को परिभाषित करेगा। यह एक महत्वपूर्ण जटिल प्रणाली है क्योंकि आपको उपयोगकर्ता को किस कीमत का उपयोग करने के लिए नियमों को परिभाषित करने की आवश्यकता होगी।

अद्यतन

यहाँ एक गतिशील धुरी क्वेरी का उपयोग करने का एक उदाहरण है:

तालिका #BookPrice (bookId पूर्णांक, मूल्य पैसे, PriceType nvarchar (30)) #BookPrice मूल्यों में डालने (बनाने 1,10.55, 'सूची') #BookPrice मूल्यों में

डालने (1,9.50, 'लागत') #bookPrice मूल्यों में डालने (2,10.22, 'सूची')

/चित्रा बाहर जो कीमतों की जरूरत है .... probally नहीं क्वेरी द्वारा मेज ही/ घोषित @priceQuery varchar (max) चयन @priceQuery = IsNull (@priceQuery, '') + '[ '+ डाली (PriceType varchar के रूप में (32)) +'], ' से पी

( #BookPrice से अलग PriceType चुनें) - निकालें पिछले अल्पविराम @priceQuery = बाएं सेट (@ priceQuery, लेन (@priceQuery) -1)

@dynq घोषित करें uery varchar (max) सेट @dynquery = 'bookId का चयन करें, *' + '#BookPrice से' + 'धुरी (' + 'अधिकतम ([मूल्य])' + 'के लिए [PriceType]' + ' में ('+ @priceQuery +')) PivotTable '

कार्यकारी (@dynquery)

ड्रॉप तालिका #bookPrice रूप

अद्यतन

ऊपर नमूना हो दिखाने के लिए अपडेट किया गया डब्ल्यू यदि आप एक किताब जो मूल्य प्रकार है कि यह क्वेरी

+0

वास्तव में यहां समस्या है - मेरे पास एक पुस्तक के लिए कई कीमतें हो सकती हैं और यही वह है जो मैं –

1

यहाँ प्रश्न में के रूप में अशक्त दिखाई देगा याद आ रही है है:

Wil lthe पुस्तक मूल्य प्रकार की सूची स्थिर हो सकता है?या कीमतों के प्रकार हैं (कोलंबस डे प्राइस, स्पेशल सुपरबॉर्न XXXVIII प्राइस, क्योंकि मुझे मंगलवार की कीमत पसंद है, अक्सर दिखाई देने और असफल होने के लिए?

यदि सूची स्थैतिक है, तो 5 या 6 अलग-अलग प्रकार की कीमतें कहें, फिर रख दें उन्हें उत्पाद तालिका में एक अतिरिक्त स्तंभ में प्रत्येक।

सूची बदलने (यहां तक ​​कि केवल थोड़ा अगर और/या बहुत कम है) तो एक अलग तालिका कीमतों के लिए जोड़ सकते हैं।

Create Table Prices (
    ProductId Integer Not Null, 
    PriceTypeId Integer Not Null, 
    Price Decimal(16,4) Not Null, 
    Primary Key Constraint PricePK (ProductId, PriceTypeId) 
    ) 
2

के रूप में दूसरों है उल्लेख किया गया है, यदि आप डेटा को अपनी तालिका के भीतर पंक्तियों के रूप में संग्रहीत करते हैं तो आपको अधिक मूल्यवानता की आवश्यकता होने पर अधिक लचीलापन होगा। इस दृष्टिकोण का उपयोग करने के लिए सबसे अधिक संभावना है कि आपको एक पंक्ति के साथ एक पंक्ति के साथ परिणामों को आउटपुट करने के लिए डेटा को पिवोट करने की आवश्यकता होगी, उसी पंक्ति में शामिल सभी मूल्य निर्धारण विकल्पों के साथ (जैसा कि आपका उदाहरण निहित है)। आप जिस SQL ​​सर्वर का उपयोग कर रहे हैं उसके आधार पर इसे लागू करने के लिए अपेक्षाकृत मामूली हो सकता है, या यह थोड़ा और चुनौतीपूर्ण हो सकता है। अधिक जानकारी के लिए यह SO question देखें।

यदि मूल्य प्रकार स्थिर हैं तो आप पंक्तियों की बजाय तालिका के कॉलम के रूप में डेटा को स्टोर करने के लिए बेहतर ढंग से सेवा कर सकते हैं। नियमों को बदलने के लिए थोड़ा और काम होने की लागत पर, जिस फ़ॉर्म को आप ढूंढ रहे हैं उसमें डेटा को वापस करने के लिए यह छोटा हो जाता है।

CREATE TABLE Books (
BookId Int, 
Name Varchar 
) 

कीमतों के लिए एक:

CREATE TABLE Prices (
PriceId Int, 
Amount decimal, 
PriceName varchar 
) 

और एक सवाल

आप तीन टेबल यहां पुस्तकों के लिए आप मॉडल, एक का प्रतिनिधित्व करने के लिए उपयोग कर सकते ग़लत व्याख्या के लिए खेद है:

0
संपादित

उन सभी को एक साथ जोड़ने के लिए (इसमें वर्तमान मूल्य दिखाने के लिए एक ध्वज है):

CREATE TABLE BookPrices (
BookId Int, 
PriceId Int, 
Current bit 
) 

प्राइसनाम एक पिवट क्वेरी के लिए एक हुक प्रदान करता है, जो आपकी पंक्तियों को कॉलम में बदल देगा। मेरे परीक्षण में मैंने शेल्फ और ऑनलाइन

SELECT * 
FROM (
    SELECT Book.Name BookName, Price.Amount Amount, Price.Name PriceName 
    FROM Books Book 
    JOIN BookPrices bp 
     ON Book.BookId = bp.BookId 
    JOIN Prices Price 
     ON Price.PriceId = bp.PriceId 
) DataTable 
PIVOT(
    SUM(Amount) 
    FOR PriceName IN ([Shelf],[Online]) 
) PivotTable 
+0

मॉडल नहीं कर सकता जो मुझे कीमतों के रूप में कीमत देता है !! मुझे उन्हें कॉलम के रूप में चाहिए :( –

0

मुझे लगता है कि मुझे ऐसी ही समस्या है।
मैं T-SQL निर्माण 'धुरी'
के साथ इस हल (कुरूपता: आप स्पष्ट रूप से क्वेरी में स्तंभों राज्य के लिए है)

हम T-SQL का उपयोग कर रहे हैं।
मुझे आपके द्वारा उपयोग की जाने वाली एसक्यूएल बोलीभाषा नहीं है, इसलिए यह लागू नहीं हो सकता है।

http://www.tsqltutorials.com/pivot.php

0

इस से चोरी शायद आप क्या चाहते हैं हो सकता है।

SELECT D.ID, D.[NAME] 
, SUM(D.SpecialOffer) AS SpecialOffer 
, SUM(D.BulkPrice) AS BulkPrice 
, SUM(D.Normal) AS Normal 
FROM (
SELECT BD.ID AS ID, BD.NAME AS [NAME] 
    , CASE WHEN BP.Kind LIKE N'%SpecialOffer%' THEN BP.Price ELSE NULL END AS SpecialOffer 
    , CASE WHEN BP.Kind LIKE N'%BulkPrice%' THEN BP.Price ELSE NULL END AS BulkPrice 
    , CASE WHEN BP.Kind LIKE N'%Normal%' THEN BP.Price ELSE NULL END AS Normal 
FROM BookDetails BD 
INNER JOIN BookPrices BP ON BP.ID_BOOK_DETAILS = BD.ID) D 
GROUP BY D.ID, D.[NAME] 

बस सुनिश्चित करें कि कॉलम नाम आपके अनुरूप हैं और इसे करना चाहिए। इसके अलावा, यह एएनएसआई है, इसलिए यह कोई डीबीएमएस विशिष्ट एसक्यूएल डीक्यूएल कोड नहीं है और इसका इस्तेमाल ओरेकल, एसक्यूएल सर्वर, आदि पर किया जा सकता है

संबंधित मुद्दे