SQL सर्वर 2005 में निम्न तालिका दी गई है:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
निम्नलिखित परिणाम प्राप्त करने वाले क्वेरी को लिखने का सबसे अच्छा तरीका क्या है (यानी कि अंतिम कॉलम की पैदावार - प्रत्येक पंक्ति के लिए Col1, Col2 और Col 3 से बाहर minium मान वाले स्तंभ )?
ID Col1 Col2 Col3 TheMin
-- ---- ---- ---- ------
1 3 34 76 3
2 32 976 24 24
3 7 235 3 3
4 245 1 792 1
अपडेट करें:
स्पष्टीकरण के लिए (जैसा मैंने कॉमिक्स में कहा है) वास्तविक परिदृश्य में डेटाबेस ठीक से सामान्यीकृत है । ये "सरणी" कॉलम एक वास्तविक तालिका में नहीं हैं, लेकिन एक परिणाम सेट में हैं जो एक रिपोर्ट में आवश्यक है। और नई आवश्यकता यह है कि रिपोर्ट को इस MinValue कॉलम की भी आवश्यकता है। मैं अंतर्निहित परिणाम सेट को नहीं बदल सकता और इसलिए मैं एक आसान "जेल कार्ड से बाहर निकलना" के लिए टी-एसक्यूएल को देख रहा था।
मैंने नीचे वर्णित CASE दृष्टिकोण की कोशिश की और यह काम करता है, हालांकि यह थोड़ा बोझिल है। यह उत्तरों में बताए गए की तुलना में अधिक जटिल है क्योंकि आपको इस तथ्य के लिए पूरा करने की आवश्यकता है कि एक ही पंक्ति में दो मिनट के मान हैं।
वैसे भी, मैंने सोचा कि मैं अपने वर्तमान समाधान को पोस्ट करूंगा, जो मेरी बाधाओं को देखते हुए बहुत अच्छा काम करता है। यह UNPIVOT ऑपरेटर का उपयोग करता है:
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
मैं कहता हूँ कि मैं यह उम्मीद नहीं करता कि यह सर्वश्रेष्ठ प्रदर्शन की पेशकश करेगा, लेकिन परिस्थितियों को देखते हुए (मैं सभी प्रश्नों को नए MinValue कॉलम की आवश्यकता के लिए पुनः डिज़ाइन नहीं कर सकता), यह एक बहुत ही सुंदर है "जेल से बाहर निकलना कार्ड "।