2012-02-01 16 views
0

私は非常に乱雑なクエリを持っています。サブクエリを分離/簡略化する方法があるかどうか、知りたいと思います。私はこの容疑者のように見える!! http://weblogs.sqlteam.com/jeffs/archive/2005/12/14/8546.aspx大規模なグループ化と左内ジョインの簡素化

;with 
cte_biggie ([Full Date],  [Year Entered], [Month Entered], [Day Entered],  
[DOW],  [Week Ending] ,[CountAccns],[Sales Rep], [MLNPI], [IMSNPI],  [Physician],  
[Practice Code], [MLIS Code],  [Practice Name], 
[Date Established],  [Address], [Address2], [City],  [State], [Status] 
) as (
select CONVERT(VARCHAR(8), [DATE entered], 1),DATEPART(yy, [DATE entered]) , 
      LEFT(DATENAME(MONTH, GETDATE()), 3) 
      ,DATEPART(dd, [DATE entered]), 

      case when DATEPART(WEEKDAY, [DATE entered])=1 THEN 'Sun' 
      when DATEPART(WEEKDAY, [DATE entered])=2 THEN 'Mon' 
      when DATEPART(WEEKDAY, [DATE entered])=3 THEN 'Tus' 
      when DATEPART(WEEKDAY, [DATE entered])=4 THEN 'Wed' 
      when DATEPART(WEEKDAY, [DATE entered])=5 THEN 'Thu' 
      when DATEPART(WEEKDAY, [DATE entered])=6 THEN 'Fri' 
      when DATEPART(WEEKDAY, [DATE entered])=7 THEN 'Sat' 
      end, 
      CONVERT(VARCHAR(8), DATEADD (D, -1 * DatePart (dw,[date entered]) + 6, [date entered]), 1), 
      count(a.[specimen id]) ,c.salesrep,c.npi,e.npib,[Requesting Physician] , 
      a.[practice code],b.[mlis practice id],[practice name], 

    c.dateestablished , c.practiceaddress1, c.practiceaddress2,c.practicecity,c.practicestate, 
    b.[Active Inactive] 
from quicklabdump a 
    left outer join qlmlismapping b 
    on (b.[practice code] = a.[practice code]) 
    left outer join PracticeandPhysician c 
    on (a.[Requesting Physician]=c.doctorfirstname+' '+c.DOCTORLASTNAME 
    and a.[practice code]=c.practicecode) 
    left outer join TestResults d 
    on a.QuickLabDumpID = d.QuickLabDumpID 
    left outer join IMSData e 
    on c.NPI=e.npib 
where [Date Entered] <= '20111231' 
and [Date Entered] >= '20111201' 


group by [DATE entered],DATEPART(yy, [DATE entered]), DATEPART(mm, [DATE entered]),DATEPART(dd, [DATE entered]), a.[practice name],b.[mlis practice id],a.[practice code], 
    a.[Requesting Physician],c.salesrep,c.dateestablished, c.practicecity,c.practicestate,c.npi,e.npib,c.practiceaddress1 ,c.practiceaddress2, 
    b.[Active Inactive] 


) 

select * from cte_biggie 
+1

おそらくDATENAME()およびLEFT()関数を使用してCASEブロックをトリミングできます。グループ分けの観点から見ると、個々の標本IDの合計が小計されているようです...何ですか? 「_______あたりの標本ID数」のようなフレーズに分解できれば、サブクエリにカプセル化する必要があるものを把握するのに役立ちます。 – lyrisey

答えて

2

は、私は一般的に明確だことでグループを作るために、サブ選択の使用に関するlink that you providedとそうは思いません。私はそれがSybaseのオーブンから出て以来、これまでSQL ServerにTSQLを書いてきました。私にとっては、集計ではない結果セットで返される列がGROUP BYで反復されることは間違いありません。実際、GROUP BYセクションでコード化されても、私はそれらに注意を払っていません。私にとっては、実際には、必要ではないサブセレクトを見て気を散らしています。私は時々起こる、絶対的な必要性があるときにのみ、サブセレクションを使用する傾向があります。しかし、サブセレクションが表示されたら、特別なことが起こっているときにそれらを使用していることを知っているので、ロジックに特別な注意を払うのが私の合図です。私はGROUP BYの最後にいくつかの余分な列を見ても問題はなく、SQLエンジンは完全な列のリストを持つことが性能損失ではないほどスマートだと思います。

あなたのSQLをどのようにフォーマットしますか。私は空白を持つ列名を使用するファンではないので、おそらく列名から空白を削除し、すべての角括弧を取り除くことができます。

select 
    [Full Date]=CONVERT(VARCHAR(8), [DATE entered], 1), 
    [Year Entered]=DATEPART(yy, [DATE entered]) , 
    [Month Entered]=LEFT(DATENAME(MONTH, GETDATE()), 3), 
    [Day Entered]=DATEPART(dd, [DATE entered]), 
    [DOW]= 
     case when DATEPART(WEEKDAY, [DATE entered])=1 THEN 'Sun' 
     when DATEPART(WEEKDAY, [DATE entered])=2 THEN 'Mon' 
     when DATEPART(WEEKDAY, [DATE entered])=3 THEN 'Tus' 
     when DATEPART(WEEKDAY, [DATE entered])=4 THEN 'Wed' 
     when DATEPART(WEEKDAY, [DATE entered])=5 THEN 'Thu' 
     when DATEPART(WEEKDAY, [DATE entered])=6 THEN 'Fri' 
     when DATEPART(WEEKDAY, [DATE entered])=7 THEN 'Sat' 
     end, 
    [Week Ending]=CONVERT(VARCHAR(8), 
     DATEADD (D, -1 * DatePart (dw,[date entered]) + 6, [date entered]), 1), 
    [CountAccns]=count(a.[specimen id]), 
    [Sales Rep]=c.salesrep, 
    [MLNPI]=c.npi, 
    [IMSNPI]=e.npib, 
    [Physician]=[Requesting Physician], 
    [Practice Code]=a.[practice code], 
    [MLIS Code]=b.[mlis practice id], 
    [practice name], 
    [Date Established]=c.dateestablished , 
    [Address]=c.practiceaddress1, 
    [Address2]=c.practiceaddress2, 
    [City]=c.practicecity, 
    [State]=c.practicestate, 
    [Status]=b.[Active Inactive] 
from 
    quicklabdump a 
    left outer join qlmlismapping b on (b.[practice code] = a.[practice code]) 
    left outer join PracticeandPhysician c on 
     a.[Requesting Physician]=c.doctorfirstname+' '+c.DOCTORLASTNAME 
     and a.[practice code]=c.practicecode 
    left outer join TestResults d on a.QuickLabDumpID = d.QuickLabDumpID 
    left outer join IMSData e on c.NPI=e.npib 
where  
    [Date Entered] <= '20111231' 
    and [Date Entered] >= '20111201' 
group by 
    c.salesrep, 
    c.npi, 
    e.npib, 
    [Requesting Physician], 
    a.[practice code], 
    b.[mlis practice id], 
    [practice name], 
    c.dateestablished , 
    c.practiceaddress1, 
    c.practiceaddress2, 
    c.practicecity, 
    c.practicestate, 
    b.[Active Inactive] 
+0

このような完全で思いやりのある答えに感謝します。 –

関連する問題