2012-09-13 11 views
7

tengo tablarecuento SQL fila duplicada como única

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 

necesito resultado como

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

Aquí, Active y Inactive campos son suma de Status campos basado en 0 o 1

Eso significa aquí State para Gujarat, Hay three veces 0 ocurrió, pero two filas duplicadas para StationCode - 12345. Significa que se considerará como One.

que tienen consulta, como a continuación

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 

Pero soy incapaz de contar duplicado StationCode fila como individual.

¿Cómo puedo hacer eso?

+0

filtro de las filas de una subconsulta, comprobar mi respuesta a continuación. –

+0

posible duplicado de [Contar y tener consulta] (http: // stackoverflow.com/questions/12345670/count-and-having-query) – hims056

Respuesta

1

pienso esto probablemente abordaría su problema. No estoy 100% seguro de la sintaxis, pero si puedes probarlo y decirme si no funciona, puedo intentar ajustarlo para ti. La idea es crear una tabla derivada usando Agrupar por para eliminar los duplicados que no quieres primero y luego la consulta externa es igual que tu consulta original, solo en la tabla derivada.

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

puede filtrar las filas de forma única en una subconsulta. tratar,

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

Primera recuperar las tuplas distintas de (, Distrito Estado, Estado) y luego ejecutar la consulta de agregación en la parte superior de la misma, así:

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

Será la columna "Activa" de retorno como para el Distrito de Gujarat y Taluka Banaskantha, pero necesito 2 porque el Estado de Gujarat tiene 3 cuentas activas pero hay dos filas que tienen el mismo código de la estación por lo que se considerará como uno, por lo que volverá a ser 2. –

2

Debe utilizar ya sea DISTINCT cláusula o GROUP BY cláusula en sub-consulta antes de obtener los datos de ella:

Usando DISTINCT cláusula:

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; 

Usando GROUP BY cláusula:

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; 

See this SQLFiddle

También agregué algunos registros en la tabla para verificar la consulta en this SQLFiddle. Y funcionó bien.

1

Utilice el SQL continuación:

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 
Cuestiones relacionadas