Dinesh Guptha
Dinesh Guptha

Reputation: 97

SQL Making Null Value in all columns which has a same value

I have a scenario in which i generate a temp table in that table i have to remove the repeating values like....

id      Ref_No  css_no  haz_no  Emp_no  X-Fac       Y-Fac   Location    street_name     Locale  town_name   admin_area
341139  317000334   NULL    NULL    37101195    588550.00   185922.00       SUTTON ROAD     SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    582297.00   582297.00   ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    85000.00    85000.00    ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477641  317000334   NULL    NULL    37100003    85000.00    85000.00    ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
477649  317000334   NULL    NULL    37100004    591278.00   591278.00   aaaaaaaaaaaaaaaaaaaa    ACACIA DRIVE    THORPE BAY  SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477651  317000334   NULL    NULL    37101738    593365.00   593365.00   adfasdsfwerwer  ADJACENT TO 51 SANDPIPER CLOSE  SHOEBURYNESS    SOUTHEND-ON-SEA SOUTHEND-ON-SEA
477661  317000334   NULL    NULL    37100036    589791.00   187149.00       ARCHER AVENUE       SOUTHEND-ON-SEA SOUTHEND-ON-SEA
487012  317000334   NULL    NULL    42203885    359280.00   359280.00   yuiuyiuy    ABERDARE CLOSE  BURTONWOOD AND WESTBROOK    WARRINGTON  WARRINGTON

I want this table output as......

id      Ref_No  css_no  haz_no  Emp_no  X-Fac       Y-Fac   Location    street_name     Locale  town_name   admin_area
    341139  317000334   NULL    NULL    37101195    588550.00   185922.00       SUTTON ROAD     SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477641  317000334   NULL    NULL    37100003    582297.00   582297.00   ttttttttttttttttttttttttttttttttttttttttttttttttt.....  ABERDEEN GARDENS        LEIGH-ON-SEA    SOUTHEND-ON-SEA
                        NULL    NULL                85000.00    85000.00    
                        NULL    NULL                85000.00    85000.00    
    477649  317000334   NULL    NULL    37100004    591278.00   591278.00   aaaaaaaaaaaaaaaaaaaa    ACACIA DRIVE    THORPE BAY  SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477651  317000334   NULL    NULL    37101738    593365.00   593365.00   adfasdsfwerwer  ADJACENT TO 51 SANDPIPER CLOSE  SHOEBURYNESS    SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    477661  317000334   NULL    NULL    37100036    589791.00   187149.00       ARCHER AVENUE       SOUTHEND-ON-SEA SOUTHEND-ON-SEA
    487012  317000334   NULL    NULL    42203885    359280.00   359280.00   yuiuyiuy    ABERDARE CLOSE  BURTONWOOD AND WESTBROOK    WARRINGTON  WARRINGTON

Like wise i need to remove the value which are returning again and agin for the same infomartion... can any one help me with this.... and the table wi'll be generated according with the condition each time so the values may not be same all time...

Upvotes: 0

Views: 106

Answers (1)

Nikola Markovinović
Nikola Markovinović

Reputation: 19356

This is display problem and as such is best dealt with in client application. But if you have no choice but to do it in t-sql you might use row_number() over() to isolate first occurrence of some value and case when then will replace all other occurrence's value with empty string:

; with cte as
(
  select *,
         row_number() over(partition by id
         -- determine order by detail table.
         -- I don't know your schema.
                           order by [y-fac]) rn
    from tempTable
)
select case when rn = 1
            then convert(varchar(20), id)
            else ''
        end as id,
       case when rn = 1
            then convert(varchar(20), Ref_No)
            else ''
        end as Ref_No,
       css_no,
       haz_no,
       case when rn = 1
            then convert(varchar(20), Emp_no)
            else ''
        end as Emp_no,
       X-Fac,
       Y-Fac,
       case when rn = 1
            then Location
            else ''
        end as Location,
       case when rn = 1
            then street_name
            else ''
        end as street_name,
       case when rn = 1
            then Locale
            else ''
        end as Locale,
       case when rn = 1
            then town_name
            else ''
        end as town_name,
       case when rn = 1
            then admin_area
            else ''
        end as admin_area
from cte
order by id, rn

As this looks as master-detail you might do the same while inserting using left join to join to master only if this is first row of detail:

; with ordered as
(
  select *,
         row_number() over (partition by master_id
                            order by detail_id) rn
    from detail
)
insert into tempTable ( ... )
select ...
  from ordered
  left join master
    on ordered.master_id = master.master_id
   and ordered.rn = 1

This will add master data to first row of detail only. Other rows will contain nulls.

Upvotes: 1

Related Questions