2010-10-14 26 views
2

我有必要建立從姓,名,按以下規則中初始的字符串:SQL - 場串聯,基於可變

  1. 如果姓是獨一無二的,只是 回報姓氏
  2. 如果最後 名稱不是唯一的,但名字的第一個字母 是獨一無二的, 回報姓+的 名
  3. 第一個字母如果姓和 第一萊特名字的r是 不唯一,返回姓氏+ 名字+中間的第一個字母 首字母縮寫。

例如,該表可能是:

MDC MDLast  MDFirst  MDInit 
    3 Jones  Fred   A  
    21 Smith  Sam   D 
    32 Brown  Tom   E 
    42 Brown  Ted   A 
    55 Smith  Al   D 

查詢應返回:

MDC MDFormattedName  
3 Jones 
21 Smith S 
32 Brown TE 
42 Brown TA 
55 Smith A 

我已經寫了一個查詢,差不多的作品,但它使用幾個嵌套查詢,並且仍然需要更多(可能)制定可行的解決方案,並且效率非常低。我確信有一個'正確'的方法來實現這個(對於SQL Server 2005,BTW)。

這是我到目前爲止。它不起作用,由於我丟失的聚合ID可能無法做最後的連接來獲得ID /名稱對。

select 
    CASE 
     WHEN CountLastFirst > 1 THEN 
      CASE WHEN MDInit IS NOT NULL THEN MDLastFirst + LEFT(MDInit,1) ELSE MDLastFirst END 
     WHEN CountLastFirst = 1 AND CountLast > 1 THEN MDLastFirst 
     ELSE MDLast 
    END as MDName 

FROM 

(

select x.MDLast, CountLast, MDLastFirst, CountLastFirst FROM 
(
select MDLast,Count(MDLast) as CountLast FROM 
MDList 
GROUP BY MDLast) as x 

INNER JOIN 
(select MDLast, MDLastFirst,Count(MDLastFirst) as CountLastFirst FROM 
(
select MDLast, 
MDLast + ' ' + LEFT(MDFirst,1) as MDLastFirst 
From MDList 
) as a 
GROUP BY MDLastFirst, MDLast) as y ON x.MDLast = y.MDLast 
) as z 

回答

1

假設MDCTable表名,這應該工作:

SELECT MDCTable.MDC, 
    CASE MDCCount.NameCount 
    WHEN 1 
    THEN MDCTable.MDLast 
    ELSE  
     CASE MDFormat1Count 
     WHEN 1 
     THEN MDFormat1.MDFormat1Name 
     ELSE MDCTable.MDLast + ' ' + upper(left(MDCTable.MDFirst, 1)) + 
        MDCTable.MDInit 
     END 
    END AS MDFormattedName 
FROM MDCTable 
INNER JOIN 
(
    SELECT COUNT(MDLast) as NameCount, MDLast 
    FROM MDCTable 
    GROUP BY MDLast 
) MDCCount ON MDCCount.MDLast = MDCTable.MDLast 
INNER JOIN (
    SELECT COUNT(MDLast + left(MDFirst, 1)) as MDFormat1Count, MDLast + ' ' + 
     left(MDFirst, 1) AS MDFormat1Name 
    FROM MDCTable 
    GROUP BY MDLast + ' ' + left(MDFirst, 1) 
) MDFormat1 ON MDCTable.MDLast + ' ' + left(MDCTable.MDFirst, 1) = 
    MDFormat1.MDFormat1Name 
ORDER BY MDCTable.MDC 
+0

非常好,謝謝。我從來沒有在ON子句中使用表達式,這是一個很好的技巧。我試圖找出如何加入MDC索引,但沒有一個明顯的方法來做到這一點。 – BridgetG 2010-10-14 20:23:40

0

您是否考慮過在應用程序中執行此操作而不是直接在SQL語句中執行此操作?除非你有充足的理由直接在SQL中這樣做,否則對於這種情況來說,這幾乎總是更好的方法。

+0

名稱的列表是從一堆來源,包括存儲的特效,VB程序,訪問查詢,SAS程序等通過提供訪問它在一定程度上解決了一堆問題。也許不是最有效的,但重新工作的所有這些應用程序是不實際的。 – BridgetG 2010-10-14 20:26:21