2009-09-01 13 views
5

मुझे एक क्वेरी की आवश्यकता है जो एक तालिका लौटाएगी जहां प्रत्येक कॉलम किसी अन्य तालिका के कॉलम में अलग-अलग मानों की गणना होगी। मुझे लगता है कि मैं सिर्फ इस एक बहुत लंबा चयन खंड बना सकता हैएसक्यूएल: प्रत्येक कॉलम में अलग-अलग मानों की संख्या

select count(distinct columnA) from table1; 

:

मैं कैसे एक स्तंभ में अलग-अलग मान गिनती करने के लिए पता

select count(distinct columnA), count(distinct columnB), ... from table1; 

लेकिन है कि बहुत नहीं है सुरुचिपूर्ण और यह हार्डकोडेड है। मैं कुछ और लचीला पसंद करेंगे।

+1

यह सुरुचिपूर्ण और सरल समाधान है ... क्या आपका मतलब है "तालिका का नाम दिया गया है, मुझे उस तालिका में प्रत्येक कॉलम के लिए अलग-अलग मायने रखता है"? – gbn

+1

आप किस डेटाबेस का उपयोग कर रहे हैं? –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1330692/distinct-pair-of-values-sql –

उत्तर

0

मैं की सभी प्रतिक्रियाओं की सराहना करते हैं। मुझे लगता है कि समाधान जो इस स्थिति में मेरे लिए सबसे अच्छा काम करेगा (किसी बाहरी प्रोग्राम से तालिका के प्रत्येक कॉलम में अलग-अलग मानों की संख्या को गिनती है जिसमें उसके नाम को छोड़कर तालिका का कोई ज्ञान नहीं है) निम्नानुसार है:

रन "तालिका 1 का वर्णन करें" और परिणाम से स्तंभ नाम खींचें।

कॉलम नामों के माध्यम से लूप करें और प्रत्येक कॉलम में अलग-अलग मानों को गिनने के लिए क्वेरी बनाएं। क्वेरी कुछ चुनिंदा होगी "चयन गिनती (विशिष्ट कॉलम ए), गिनती (विशिष्ट कॉलम बी), ... तालिका 1 से"।

1

यह कोड आपको डेटा के रूप में प्रत्येक के लिए संबंधित विशिष्ट मूल्य गणना के साथ 'तालिका 1' में सभी कॉलम देना चाहिए।

DECLARE @TableName VarChar (Max) = 'table1' 
DECLARE @SqlString VarChar (Max) 

set @SqlString = (
    SELECT DISTINCT 
    'SELECT ' + 
     RIGHT (ColumnList, LEN (ColumnList)-1) + 
     ' FROM ' + Table_Name 
    FROM INFORMATION_SCHEMA.COLUMNS COL1 
     CROSS AppLy (
     SELECT ', COUNT (DISTINCT [' + COLUMN_NAME + ']) AS ' + '''' + COLUMN_NAME + '''' 
      FROM INFORMATION_SCHEMA.COLUMNS COL2 
      WHERE COL1.TABLE_NAME = COL2.TABLE_NAME 
      FOR XML PATH ('') 
    ) TableColumns (ColumnList) 
    WHERE 
     1=1 AND 
     COL1.TABLE_NAME = @TableName 
) 

EXECUTE (@SqlString) 
1

और यह हार्डकोडेड है।

एसक्यूएल कथन के लिए फ़ील्ड सूची प्रदान करने के लिए हार्डकोडिंग नहीं है। यह आम और स्वीकार्य अभ्यास है।

+0

... जैसा प्रोग्राम चल रहा है, एसक्यूएल बना रहा है, जहां तक ​​यह जाता है (आपके उपयोगकर्ताओं को आपके द्वारा रखे गए मूल्यों को कभी भी आपूर्ति नहीं करते - इस प्रश्न में ठीक है, आपके पास कॉलम सूची कहीं है)। – ijw

+0

अगर मैं कुछ एसक्यूएल कोड-जेन पर जा रहा था, और यदि मैं एमएसएसक्लसेवर पर था, तो मैं sysobjects और syscolumns की जांच करता। –

+0

यदि आप कोड को अधिक पोर्टेबल तरीके से लिखना चाहते हैं, तो आपको Info_Schema.Tables और Information_Schema से चयन करना चाहिए।Sysobjects और syscolumns से चुनने के बजाय कॉलम – Kibbee

-3

DISTINCT बुरा है।

+0

कृपया अधिक जानकारी के साथ इसे योग्य बनाएं। COUNT/GROUP BY करने के लिए अनुपालन करते समय अलग-अलग बुराई का उपयोग कैसे किया जा रहा है? – Kibbee

+0

DISTINCT बड़े डेटासेट और प्लेटफार्म से मंच तक गलती से व्यवहार करता है। कम से कम मेरे अनुभव में। मुझे समूहीकृत परिणाम मिलते हैं, खासकर यदि आप अलग-अलग एन्कोडेड डेटा, यूटीएफ, आदि से निपटते हैं –

+0

मुझे समूह का उपयोग करके देखना होगा। – Ryan

0

यह तालिका में प्रत्येक फ़ील्ड के लिए आवश्यक नहीं होगा। उदाहरण के लिए, आप SQL सर्वर ntext या छवि फ़ील्ड के विरुद्ध DISTINCT नहीं कर सकते हैं जब तक कि आप उन्हें अन्य डेटा प्रकारों में नहीं डालते और कुछ सटीकता खो देते हैं।

+0

अच्छा बिंदु। मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है। फ़ील्ड केवल टेक्स्ट या संख्या होगी। – Ryan

3

इस (SQL सर्वर 2005 सिंटेक्स) की कोशिश:

DECLARE @YourTable table (col1 varchar(5) 
         ,col2 int 
         ,col3 datetime 
         ,col4 char(3) 
         ) 

insert into @YourTable values ('abcdf',123,'1/1/2009','aaa') 
insert into @YourTable values ('aaaaa',456,'1/2/2009','bbb') 
insert into @YourTable values ('bbbbb',789,'1/3/2009','aaa') 
insert into @YourTable values ('ccccc',789,'1/4/2009','bbb') 
insert into @YourTable values ('aaaaa',789,'1/5/2009','aaa') 
insert into @YourTable values ('abcdf',789,'1/6/2009','aaa') 


;with RankedYourTable AS 
(
SELECT 
    ROW_NUMBER() OVER(PARTITION by col1 order by col1) AS col1Rank 
     ,ROW_NUMBER() OVER(PARTITION by col2 order by col2) AS col2Rank 
     ,ROW_NUMBER() OVER(PARTITION by col3 order by col3) AS col3Rank 
     ,ROW_NUMBER() OVER(PARTITION by col4 order by col4) AS col4Rank 
    FROM @YourTable 
) 
SELECT 
    SUM(CASE WHEN  col1Rank=1 THEN 1 ELSE 0 END) AS col1DistinctCount 
     ,SUM(CASE WHEN col2Rank=1 THEN 1 ELSE 0 END) AS col2DistinctCount 
     ,SUM(CASE WHEN col3Rank=1 THEN 1 ELSE 0 END) AS col3DistinctCount 
     ,SUM(CASE WHEN col4Rank=1 THEN 1 ELSE 0 END) AS col4DistinctCount 
    FROM RankedYourTable 

उत्पादन:

col1DistinctCount col2DistinctCount col3DistinctCount col4DistinctCount 
----------------- ----------------- ----------------- ----------------- 
4     3     6     2 

(1 row(s) affected) 
+0

+1: संक्षिप्त, सुरुचिपूर्ण, गालदार ... – gbn

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