if more than 1 match, do not return 'unknown'

I composed a monster query. I'm certain that it can be optimized, and I would more than appreciate any comments/guidance on the query itself; however, I have a specific question:

The data I am returning is sometimes duplicated on multiple columns:

+-------+------+----------+------+-------+--------+----------+-------+------+
| first | last |  deaID   | cert | count |  npi   | clientid | month | year |
+-------+------+----------+------+-------+--------+----------+-------+------+
| Alex  | Jue  | UNKNOWN  | MD   |    11 | 123123 |   102889 |     7 | 2012 |
| Alex  | Jue  | BJ123123 | MD   |    11 | 123123 |   102889 |     7 | 2012 |
+-------+------+----------+------+-------+--------+----------+-------+------+

as you can see all of the fields are equal except for deaID

in this case, I would like to only return:

+------+-----+----------+----+----+--------+--------+---+------+
|      |     |          |    |    |        |        |   |      |
+------+-----+----------+----+----+--------+--------+---+------+
| Alex | Jue | BJ123123 | MD | 11 | 123123 | 102889 | 7 | 2012 |
+------+-----+----------+----+----+--------+--------+---+------+

however, if there are no duplicates:

+-------+------+---------+------+-------+--------+----------+-------+------+
| first | last |  deaID  | cert | count |  npi   | clientid | month | year |
+-------+------+---------+------+-------+--------+----------+-------+------+
| Alex  | Jue  | UNKNOWN | MD   |    11 | 123123 |   102889 |     7 | 2012 |
+-------+------+---------+------+-------+--------+----------+-------+------+

then i would like to keep it!

summary if there are duplicates remove all records with 'deaID=unknown'; however, if there is only 1 match then return that match

question how do i return unknown records IFF there is 1 match?

here is the monster query in case anybody is interested :)

with ctebiggie  as (

select distinct
p.[IMS_PRESCRIBER_ID],
p.PHYSICIAN_NPI as MLISNPI,
a.CLIENT_ID,
p.MLIS_FIRSTNAME,
p.MLIS_LASTNAME,
p_address.IMS_DEA_NBR,
p.IMS_PROFESSIONAL_ID_NBR,
p.IMS_PROFESSIONAL_ID_NBR_src,
p.IMS_CERTIFICATION_CODE,
datepart(mm,a.RECEIVED_DATE) as [Month],
datepart(yyyy,a.RECEIVED_DATE) as [Year]

from

MILLENNIUM_DW_dev..D_PHYSICIAN p
left outer join
MILLENNIUM_DW_dev..F_ACCESSION_DAILY a
on a.REQUESTOR_NPI=p.PHYSICIAN_NPI
left outer join MILLENNIUM_DW_dev..D_PHYSICIAN_ADDRESS p_address
on p.PHYSICIAN_NPI=p_address.PHYSICIAN_NPI

where 
a.RECEIVED_DATE is not null
--and p.IMS_PRESCRIBER_ID is not null
--and p_address.IMS_DEA_NBR !='UNKNOWN'
and p.REC_ACTIVE_FLG=1
and p_address.REC_ACTIVE_FLG=1
and DATEPART(yyyy,received_date)=2012
  and DATEPART(mm,received_date)=7


group by 
p.[IMS_PRESCRIBER_ID],
p.PHYSICIAN_NPI,
p.IMS_PROFESSIONAL_ID_NBR,
p.MLIS_FIRSTNAME,
p.MLIS_LASTNAME,
p_address.IMS_DEA_NBR,
p.IMS_PROFESSIONAL_ID_NBR,
p.IMS_PROFESSIONAL_ID_NBR_src,
p.IMS_CERTIFICATION_CODE,
datepart(mm,a.RECEIVED_DATE),
datepart(yyyy,a.RECEIVED_DATE),
a.CLIENT_ID

)
,
ctecount as 
(select
 COUNT (Distinct f.ACCESSION_ID) [count],
 f.REQUESTOR_NPI,f.CLIENT_ID,
 datepart(mm,f.RECEIVED_DATE) mm,
datepart(yyyy,f.RECEIVED_DATE)yyyy
from MILLENNIUM_DW_dev..F_ACCESSION_DAILY f

where 
 f.CLIENT_ID not in (select * from SalesDWH..TestPractices)

 and DATEPART(yyyy,f.received_date)=2012
  and DATEPART(mm,f.received_date)=7


group by f.REQUESTOR_NPI,
f.CLIENT_ID,
datepart(mm,f.RECEIVED_DATE),
datepart(yyyy,f.RECEIVED_DATE)
)

select ctebiggie.*,c.* from
ctebiggie
full outer join
ctecount c
on c.REQUESTOR_NPI=ctebiggie.MLISNPI
and c.mm=ctebiggie.[Month]
and c.yyyy=ctebiggie.[Year]
and c.CLIENT_ID=ctebiggie.CLIENT_ID

Answers


see this helps or not

select distinct main.col1,main.col2  ,
       isnull(( select col3 from table1 where table1.col1=main.col1
       and table1.col2=main.col2 and col3 <>'UNKNOWN'),'UNKNOWN')
from   table1 main

Sample in Sql fiddle

or fair version of yours will be

SELECT distinct first,
       last,
       cert,
       count,
       npi,
       clientid,
       month,
       year,
      isnull(
      select top 1 dealid from table1 intable where 
      intable.first=maintable.first and
      intable.last=maintable.last and
      intable.cert=maintable.cert and
      intable.npi=maintable.npi and
      intable.clientid=outtable.clientid and
      intable.month=outtable.month and
      intable.year=outtable.year
      where dealid<>'UNKNOWN'),'UNKNOWN') as dealId
FROM  table1 maintable

Assuming you have the base query, I will assign row_number and count by partition function over this resultset. Then on the outer select, if count is 1 then unknown is selected, else it is not selected.

SELECT first,
       last,
       deaID,
       cert,
       count,
       npi,
       clientid,
       month,
       year
  FROM (
         SELECT first,
                last,
                deaID,
                cert,
                count,
                npi,
                clientid,
                month,
                year,
                ROW_NUMBER() OVER (PARTITION BY
                                     first,last,cert,count,npi,clientid,month,year 
                                    ORDER BY CASE WHEN deaID = 'Unkown' THEN 0 ELSE 1 END,
                                       deaID) AS RowNumberInGroup,
                COUNT() OVER (PARTITION BY first,last,cert,count,npi,clientid,month,year)
                    AS CountPerGroup,
                 SUM(CASE WHEN deaID = 'Unkown' THEN 1 ELSE 0 END) 
                     OVER (PARTITION BY first,last,cert,count,npi,clientid,month,year)
                     AS UnknownCountPerGroup
           FROM BaseQuery
      ) T
 WHERE (T.CountPerGroup = T.UnknownCountPerGroup AND T.RowNumberInGroup = 1) OR T.RowNumberInGroup > T.UnknownCountPerGroup

Need Your Help

Carrierwave unique filename not being set

ruby-on-rails ruby carrierwave

I looked at the carrierwave wiki on github, and used the method they describe to generate unique file names:

Binding to array controller in another nib for inspector window

objective-c cocoa cocoa-bindings nib nsdocument

Binding a popup menu to an array controller with the path selection.type works fine. Binding a popup menu to a document controller with the path currentDocument.arrayController.selection.type work...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.