2013-07-31 10 views
8

तो basicially वहाँ 1 प्रश्न और 1 समस्या है:एसक्यूएल। मामला-मान की आवश्यकता है लेकिन रो-मूल्य प्राप्त

1. प्रश्न - मैं एक तालिका में 100 कॉलम की तरह है जब (और कोई कुंजी या uindex सेट किया गया है) और मैं उस टेबल को अपने साथ जोड़ना या उप-चयन करना चाहता हूं, क्या मुझे वास्तव में हर कॉलम नाम लिखना है?

2. समस्या - नीचे दिए गए उदाहरण 1. प्रश्न पता चलता है और अपने वास्तविक एसक्यूएल बयान समस्या

उदाहरण:

A.FIELD1, 
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1 
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2 
FROM TABLE A 
GROUP BY A.FIELD1 

कहानी है: अगर मैं मामला डाल नहीं अपने स्वयं के चयन वक्तव्य में मुझे वास्तविक राउनम को ग्रुप बाय में रखना होगा और ग्रुप BY सीएएसई से न्यूल-वैल्यू को समूहित नहीं करता है बल्कि पंक्ति से वास्तविक मूल्य है। और इसके कारण मुझे या तो सभी स्तंभों के साथ जुड़ना या उप-चयन करना होगा, क्योंकि कोई कुंजी नहीं है और कोई यूंडेक्स नहीं है, या किसी अन्य समाधान को ढूंढें।

डीबीएसरवर डीबी 2 है।

तो अब शब्दों के साथ इसका वर्णन करने के लिए और कोई SQL: मेरे पास "ऑर्डर आइटम" है जिसे "ZD" और "EK" (1 = ZD, 2 = EK) में विभाजित किया जा सकता है और इसे " वितरक "। हालांकि "ऑर्डर आइटम" में दो अलग-अलग "विभाग" (जेडडी, ईके) में से एक हो सकता है, "ZD" और "EK" के लिए फ़ील्ड/पंक्तियां हमेशा भर जाती हैं। मुझे "विभाग" पर विचार करने के लिए समूह की आवश्यकता है और केवल तभी नामित "विभाग" (जेडडी या ईके) बदल रहा है, तो मैं एक नया समूह बनाना चाहता हूं।

SELECT 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD, 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK, 
TABLE.DISTRIBUTOR, 
sum(TABLE.SOMETHING) AS SOMETHING, 
FROM TABLE 
GROUP BY 
ZD 
EK 
TABLE.DISTRIBUTOR 
TABLE.DEPARTEMENT 

यह यहां ग्रुप बाय में SELECT और ZD, EK में काम किया। केवल समस्या थी, भले ही ईके नामित डिप्टीमेंट नहीं था, फिर भी अगर यह बदल गया तो यह एक नया समूह खोला गया, क्योंकि वह वास्तविक ईके मूल्य का उपयोग कर रहा था, न कि केस से न्यूल, क्योंकि मैं पहले से ही ऊपर बता रहा था।

+0

की तरह कुछ को हल करने के लिए करते हैं हो सकता है आप एक ही साथ तालिका ख में स्तंभ के लिए मेज एक के प्रत्येक स्तंभ के मूल्य की जाँच मतलब है कॉलम नाम, और सभी कॉलम मेल खाना चाहिए? या आप का मतलब किसी अन्य प्रकार का तर्क है? – WarrenT

+0

बिल्कुल, लेकिन यह केवल सवाल है, असली समस्या नहीं है, जिसे मैं निकटतम समय में आगे/बेहतर समझाऊंगा। – Khazar

उत्तर

6

और यहाँ देवियों और सज्जन समस्या का हल है!

@others: ...

1

नहीं, कोई वाइल्डकार्ड समानता परीक्षण नहीं है। आपको प्रत्येक फ़ील्ड को सूचीबद्ध करना होगा जिसे आप अलग-अलग परीक्षण करना चाहते हैं। यदि आप प्रत्येक व्यक्तिगत क्षेत्र का परीक्षण नहीं करना चाहते हैं, तो आप एक हैक का उपयोग कर सकते हैं जैसे कि सभी फ़ील्ड को संयोजित करना, उदा।

WHERE (a.foo + a.bar + a.baz) = (b.foo + b.bar + b.az) 

लेकिन किसी भी तरह से, आप सभी फ़ील्ड सूचीबद्ध कर रहे हैं।

+1

"+" कॉन्सटेनेशन ऑपरेटर नहीं है, यदि कोई गैर-संख्यात्मक कॉलम है तो आपका उदाहरण विफल हो जाएगा। यहां तक ​​कि यदि आप उचित समावेशन का उपयोग करते हैं, तो यह कई मामलों में सही ढंग से काम नहीं करेगा। उदाहरण के लिए '' ए '|| नल || 'सी' और 'ए' || || 'बी' || नल 'दोनों वापस लौट आएंगे, जबकि स्पष्ट रूप से इन संयोजनों को अलग-अलग व्यवहार करना होगा। दूसरी ओर, एक नल मूल्य अन्य न्यूल मूल्य के बराबर नहीं है, इसलिए '' ए '|| नल || 'सी' और 'ए' || || नल || 'सी' या तो बराबर नहीं होगा, हालांकि इस मामले में इरादा उन्हें बराबर मानना ​​होगा। – mustaccio

+0

कृपया एसक्यूएल मानकों के शरीर पर चिल्लाओ और उन्हें मानक ऑपरेटर पर व्यवस्थित करने के लिए कहें, तो ... –

+0

कृपया जो भी आप स्वयं चाहते हैं उस पर चिल्लाओ। एएनएसआई एसक्यूएल मानक स्पष्ट रूप से डबल वर्टिकल बार को कॉन्सटेनेशन ऑपरेटर के रूप में निर्दिष्ट करता है। – mustaccio

2

असल में वाइल्डकार्ड समानता परीक्षण है। मुझे यकीन नहीं है कि आप फील्ड 1 द्वारा समूह क्यों करेंगे, जो आपके उदाहरण में असंभव प्रतीत होता है। मैं अपने प्रश्न में फिट करने की कोशिश की:

SELECT FIELD1, 
CASE WHEN FIELD2 = 1 THEN FIELD3 END AS CASEFIELD1, 
CASE WHEN FIELD2 = 2 THEN FIELD4 END AS CASEFIELD2 
FROM 
(
SELECT * FROM A 
INTERSECT 
SELECT * FROM B 
) C 
UNION -- results in a distinct 
SELECT 
A.FIELD1, 
null, 
null 
FROM 
(
SELECT * FROM A 
EXCEPT 
SELECT * FROM B 
) C 

यह डेटाटाइप्स कि तुलनीय

+0

यह मेरे प्रश्न का एक अच्छा जवाब है, लेकिन यह दुखद है हालांकि यह केवल इस तरह के अव्यवस्थित तरीके से संभव है। अब केवल समस्या को हल करने की जरूरत है। – Khazar

+0

@ ख़ार हां यह बहुत जटिल है। लेकिन सिर्फ यह दिखाना चाहता था कि यह संभव था –

0

आप TableA में सभी पंक्तियों कि TableB में मेल खाते हैं खोजने की जरूरत है, तो नहीं कर रहे हैं, कैसे INTERSECT के बारे में या अलग एक दूसरे को काटना के लिए असफल हो जायेगी?

select * from A 
INTERSECT DISTINCT 
select * from B 

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

SELECT 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD, 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK, 
TABLE.DISTRIBUTOR, 
sum(TABLE.SOMETHING) AS SOMETHING, 
FROM TABLE 
GROUP BY 
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END), 
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END), 
TABLE.DISTRIBUTOR, 
TABLE.DEPARTEMENT 

@ t-clausen.dk:: धन्यवाद)

+0

समस्या ग्रुप BY और CASE के साथ है। मुझे CASE से आने वाले मान की आवश्यकता है, लेकिन जब तक मैं उप-चयन का उपयोग नहीं करता तब तक मैं उपनाम का उपयोग नहीं कर सकता (जिसे मुझे FIELD3, FIELD4 और उनके unfiltered मानों को समूहित नहीं करना है)। तो हाँ उप-चयन सामान्य रूप से व्यर्थ है, लेकिन इस मामले में नहीं। – Khazar

+0

कृपया अंग्रेजी में आवश्यकता (ओं) की व्याख्या करें, जिसमें सीएएसई तर्क, और मिलान तर्क के साथ आपको क्या करने की आवश्यकता है (लेकिन इस तक सीमित नहीं है)। अब के लिए एसक्यूएल छोड़ दें। हम इसे प्रदान कर सकते हैं, एक बार जब हम स्पष्ट रूप से और स्पष्ट रूप से समझते हैं कि क्या करने की आवश्यकता है, – WarrenT

+0

@ t-clausen क्षमा करें, मुझे नहीं पता कि मुझे अपना जवाब देने के दौरान आपका जवाब क्यों नहीं मिला। – WarrenT

1

मैं इसे इस

WITH q as 
(SELECT 
     Department 
    , (CASE WHEN DEPARTEMENT = 1 THEN ZD 
      WHEN DEPARTEMENT = 2 THEN EK 
            ELSE null 
     END) AS GRP 
    , DISTRIBUTOR 
    , SOMETHING 
    FROM mytable 
) 
SELECT 
     Department 
    , Grp 
    , Distributor 

    , sum(SOMETHING) AS SumTHING 
    FROM q 
GROUP BY 
     DEPARTEMENT 
    , GRP 
    , DISTRIBUTOR 
संबंधित मुद्दे