2012-09-13 20 views
7

के रूप में मेजएसक्यूएल गिनती डुप्लिकेट पंक्ति मेरे पास है ही

ID  State  District  StationCode  Status 
--------------------------------------------------------------- 
1 Gujarat  Banaskantha  12345    0 
2 Gujarat  Banaskantha  12345    0 
3 M.P.   Bhopal   22315    1 
4 Gujarat  Banaskantha  12349    0 
5 Gujarat  Banaskantha  12345    1 

मैं

State  District  Active  InActive 
----------------------------------------------- 
Gujarat  Banaskantha  2   1 
M.P.  Bhopal   0   1 

यहाँ की तरह परिणाम की जरूरत है, Active और Inactive क्षेत्र हैं Status क्षेत्रों की राशि 0 या 1

के आधार पर इसका अर्थ गुजरात के लिए State है, वहां three बार 0 हुई, लेकिन StationCode - 12345 के लिए two डुप्लीकेट पंक्तियों। इसका मतलब है कि इसे One माना जाएगा।

मैं की तरह

नीचे
select distinct 
    state, 
    District, 
    SUM(
     Case 
     when Status=0 then 1 
     else 0 end 
     ) AS Active, 
    SUM(
     Case 
      when Status=1 then 1 
      else 0 
     end 
     ) AS InActive 
from 
    Station_Master 
group by state, District 

लेकिन मैं एकल के रूप में डुप्लिकेट StationCode पंक्ति गिनती करने में असमर्थ हूँ क्वेरी की है।

मैं ऐसा कैसे कर सकता है?

+0

फिल्टर एक सबक्वेरी में पंक्तियाँ, नीचे मेरा उत्तर की जाँच करें। –

+0

[गणना और क्वेरी पूछने के संभावित डुप्लिकेट] (http: // stackoverflow।कॉम/प्रश्न/12345670/गिनती और पूछताछ) – hims056

उत्तर

1

मुझे लगता है कि यह शायद आपकी समस्या का समाधान करेगा। मैं नहीं 100% वाक्य रचना के बारे में सुनिश्चित कर रहा हूँ, लेकिन आप इसे आज़माने और मुझे बताएं कि यह does not काम, मैं आप के लिए यह tweak कोशिश कर सकते हैं कर सकते हैं। बजाय सिर्फ व्युत्पन्न मेज पर - विचार एक व्युत्पन्न तालिका समूह के आधार पर का उपयोग करके डुप्लीकेट है कि आप न पहले चाहते हैं और फिर बाहरी क्वेरी आपकी मूल क्वेरी रूप में ही है समाप्त करने के लिए तैयार करना है।

SELECT Distinct 
    X.State, 
    X.District, 
    SUM(Case when X.Status=0 then 1 else 0 end) AS Active, 
    SUM(Case when X.Status=1 then 1 else 0 end) AS InActive 
FROM 
    (Select State, District, StationCode, Status 
    From Station_Master 
    Group By State,District, StationCode, Status) as X 
GROUP BY X.State, X.District 
4

आप विशिष्ट एक सबक्वेरी में पंक्तियों को फ़िल्टर कर सकते हैं। कोशिश,

SELECT DISTINCT state, district, 
     SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) Active, 
     SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) InActive 
FROM (
     SELECT DISTINCT state, district, StationCode, status 
     FROM Station_Master 
    ) a 
GROUP BY state, district 

SQLFiddle Demo

0

पहले (राज्य, जिला, स्थिति) के विशिष्ट tuples को पुनः प्राप्त करने और फिर इसे के शीर्ष पर अपने एकत्रीकरण क्वेरी चलाने, इस तरह:

SELECT 
    a.state, 
    a.District, 
    SUM(
     Case 
     when a.Status=0 then 1 
     else 0 end 
     ) AS Active, 
    SUM(
     Case 
      when a.Status=1 then 1 
      else 0 
     end 
     ) AS InActive 
from 
    (
     SELECT DISTINCT 
      state, 
      district, 
      status 
     FROM 
      Station_Master 
    ) as a 
group by a.state, a.District 
+0

यह जिला गुजरात और तालुका बनसकंठा के लिए "सक्रिय" कॉलम वापस आ जाएगा, लेकिन मुझे 2 की आवश्यकता है क्योंकि गुजरात राज्य में 3 सक्रिय गिनती है लेकिन दो पंक्तियां हैं जो समान हैं स्टेशन कोड इसलिए इसे एक के रूप में माना जाएगा, इसलिए यह 2 के रूप में वापस आ जाएगा। –

2

आप इससे पहले कि यह से डेटा लाने या तो DISTINCT खंड या उप क्वेरी में GROUP BY खंड का उपयोग करना चाहिए:

SELECT 
    state, 
    District, 
    SUM(Case when Status=0 then 1 else 0 end) AS Active, 
    SUM(Case when Status=1 then 1 else 0 end) AS InActive 
FROM 
(
    SELECT state,District,StationCode,Status 
    FROM Station_Master 
    GROUP BY state, District, Stationcode,Status 
) A 
GROUP BY state, District; 
:

SELECT DISTINCT state, district, 
     SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) Active, 
     SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) InActive 
FROM (
     SELECT DISTINCT state, district, StationCode, status 
     FROM Station_Master 
    ) A 
GROUP BY state, district; 

GROUP BY खंड का उपयोग करना:

DISTINCT खंड का उपयोग करना

See this SQLFiddle

मैं भी this SQLFiddle. में क्वेरी की जाँच के लिए तालिका में कुछ रिकॉर्ड जोड़े और ठीक काम किया।

1

नीचे एसक्यूएल का उपयोग करें:

declare @temptable table 
(
Id int, 
state nvarchar(250), 
District nvarchar(250), 
StationCode nvarchar(250), 
Status bit 
) 
Insert into @temptable values (1,'Gujarat','Banaskantha','12345',0) 
Insert into @temptable values (2,'Gujarat','Banaskantha','12345',0) 
Insert into @temptable values (3,'M.P.','Bhopal','22315',1) 
Insert into @temptable values (4,'Gujarat','Banaskantha','12349',0) 
Insert into @temptable values (5,'Gujarat','Banaskantha','12345',1) 

select tbl.state,tbl.District,SUM(cast(tbl.Status as int)) as Active ,(Count(*) - 
    SUM(cast(tbl.Status as int))) as InActive 
from (select distinct state,District,StationCode,Status from @temptable)as tbl 
group by tbl.state,tbl.District 
संबंधित मुद्दे