2010-11-18 25 views
0

私は「カスタム」フィールド情報をすべて1つのフィールド(列)に格納するCOTSデータベースを持っています。私は単一のレコードの選択された情報を引き出すためにクエリを作成しましたが、ソート/集計を行うことができるように抽出された各行から列を作成する必要があります。サブクエリSQL Server 2008の列に行

SELECT DISTINCT CFV.Value, CFV.CustomRecordsetId, CFV.CustomFieldId, CF.Name, F.id, F.ShortFileName, F.DateFileOpen, 
(select P.Name from [Amicus].[dbo].[People] P where (cf.name = 'MedLienLKUPMedProvider1' AND Convert(char,P.Id) = CFV.Value)) as ProviderName, 
(select P.DefaultPhone from [Amicus].[dbo].[People] P where (cf.name = 'MedLienLKUPMedProvider1' AND Convert(char,P.Id) = CFV.Value)) as ProviderPhone 
    FROM [Amicus].[dbo].[CustomFieldValue] CFV 
           inner join [Amicus].[dbo].[CustomField] CF on cfv.customfieldId=cf.id 
           inner join [Amicus].[dbo].[CustomRecordset] CRS on CRS.Id=CFV.CustomRecordsetId 
           inner join [Amicus].[dbo].[File] F on F.Id=CRS.RecordId 

    WHERE F.Id = {?Pm-F.Id} 
    AND  CF.Id = CFV.CustomFieldId 
    AND  CF.CustomFieldTypeId <> 23 
       AND        CRS.customrecordid = 8 
       AND (cf.name = 'MedLienAcctNo' OR cf.name = 'MedLienAmountBilled1' OR cf.name = 'MedLienAmt' OR cf.name = 'MedLienAmtDue' OR cf.name = 'MedLienDateRec' OR cf.name = 'MedLienDiagAmt' OR cf.name = 'MedLienListTF1' OR cf.name = 'MedLienLKUPMedProvider1' OR cf.name = 'MedLienNotes' OR cf.name = 'MedLienServFromDate1' OR cf.name = 'MedLienServToDate1' OR cf.name = 'MedLienTreatAmt' OR cf.name = 'MedLienDescription') 

私は、独自の列見出しにcf.nameルックアップのそれぞれを転置し、可能な場合、サブクエリを維持する必要があります:

は、ここでのクエリです。

以下は動作しますが、サブクエリは含まれません。

SELECT 

MAX(CFV.CustomRecordsetId) AS RecordNo, MAX(CFV.CustomFieldId) AS CFId, MAX(F.id) AS FileId, MAX(F.ShortFileName) AS SFN, MAX(F.DateFileOpen) AS DateOpened, 



    MAX(CASE WHEN cf.name = 'EACreditorLU' THEN CFV.Value END) AS Provider, 
    MAX(CASE WHEN cf.name = 'EADebtAmtOwed' THEN CFV.Value END) AS AmtOwed, 
    MAX(CASE WHEN cf.name = 'EADebtCategory' THEN CFV.Value END) AS Category, 
    MAX(CASE WHEN cf.name = 'EADebtClassClaim' THEN CFV.Value END) AS Class, 
    MAX(CASE WHEN cf.name = 'EADebtPer' THEN CFV.Value END) AS Per, 
    MAX(CASE WHEN cf.name = 'EADebtStatus' THEN CFV.Value END) AS Status 





FROM [Amicus].[dbo].[CustomFieldValue] CFV 
          inner join [Amicus].[dbo].[CustomField] CF on cfv.customfieldId=cf.id 
          inner join [Amicus].[dbo].[CustomRecordset] CRS on CRS.Id=CFV.CustomRecordsetId 
          inner join [Amicus].[dbo].[File] F on F.Id=CRS.RecordId 

WHERE F.Id = {?pmFileId} 
AND  CF.Id = CFV.CustomFieldId 
AND  CF.CustomFieldTypeId <> 23 
      AND        CRS.customrecordid = 24 

      GROUP BY CFV.CustomRecordsetId 

私はガスがなくなりましたので、どんな助力があれば幸いです。

ありがとうございました。

+0

もしあなたがコードやXMLを投稿するなら、テキストエディタでこれらの行をハイライトして、エディタツールバーの "code"ボタン(101 010)をクリックしてください。 –

答えて

0

独自のテーブルにサブクエリを作成します。
これを行う方法の簡単な例があります。これはあなた自身の解決策に取り組むことができると思います。そうすれば、そのアイデアを理解することに気を取られることはありません。

SELECT 
    User.Name, 
    COUNT(LoginTimes.*) 

FROM 
    Users AS User, 
    (SELECT LoginTimes.Time FROM LoginTimes WHERE LoginTimes.UserID = User.ID) AS LoginTimes 

GROUP BY 
    User.Name 

だから今LoginTimesは、私はどこにも使用することができます私のサブクエリを表した表です。
LoginTimes.Time列以上のものを抽出することもできます。 希望に役立ちます。

+0

BeemerGuy、それは非常に役に立ちます。唯一のハングアップは(LoginTimes。*)です。 – user6779712

+0

ハングアップとは何ですか? – BeemerGuy

+0

SQLでは、Group Byをすべて集計する必要があるため、サブクエリ内の集計によってサブクエリのすべての値がセット全体の最大値になります。それは、各反復のための特定の値ではなく、値を引き出します。 少なくとも、それは私が起こっていると思います。 – user6779712

0

SQLでは、すべてのSQLを集約する必要があります。サブクエリテーブルで参照されるフィールドは '配列'の一部であるため、サブクエリテーブル内のすべてのルックアップのデフォルト値は最大値です。おそらく私は間違ったことをしていたが、私はそうは思わない。

ビューを作成してクエリを実行することはできましたが、2つのビューを1つのクエリにまとめることはできませんでした。

SELECT  MAX(CFV.CustomRecordsetId) AS RecordNo, MAX(CFV.CustomFieldId) AS CFId, MAX(F.Id) AS FileId, MAX(F.ShortFileName) AS SFN, MAX(F.DateFileOpen) AS DateOpened, 
MAX(CASE WHEN cf.name = 'MedLienAcctNo' THEN CFV.Value END) AS AcctNo, 
MAX(CASE WHEN cf.name = 'MedLienAmountBilled1' THEN CFV.Value END) AS AmtBilled, 
MAX(CASE WHEN cf.name = 'MedLienAmt' THEN CFV.Value END) AS LienAmt, 
MAX(CASE WHEN cf.name = 'MedLienAmtDue' THEN CFV.Value END) AS AmtDue, 
MAX(CASE WHEN cf.name = 'MedLienDateRec' THEN CFV.Value END) AS DateRec, 
MAX(CASE WHEN cf.name = 'MedLienDiagAmt' THEN CFV.Value END) AS DiagAmt, 
MAX(CASE WHEN cf.name = 'MedLienListTF1' THEN CFV.Value END) AS LienQ, 
MAX(CASE WHEN cf.name = 'MedLienLKUPMedProvider1' THEN CFV.Value END) AS MedProvider, 
MAX(CASE WHEN cf.name = 'MedLienNotes' THEN CFV.Value END) AS Notes, 
MAX(CASE WHEN cf.name = 'MedLienServFromDate1' THEN CFV.Value END) AS ServFrom, 
MAX(CASE WHEN cf.name = 'MedLienServToDate1' THEN CFV.Value END) AS ServTo, 
MAX(CASE WHEN cf.name = 'MedLienTreatAmt' THEN CFV.Value END) AS TreatAmt, 
MAX(CASE WHEN cf.name = 'MedLienDescription' THEN CFV.Value END) AS Description 

FROM   dbo.CustomFieldValue AS CFV INNER JOIN 
      dbo.CustomField AS CF ON CFV.CustomFieldId = CF.Id AND CFV.CustomFieldId = CF.Id INNER JOIN 
      dbo.CustomRecordset AS CRS ON CRS.Id = CFV.CustomRecordsetId INNER JOIN 
      dbo.[File] AS F ON F.Id = CRS.RecordId 

WHERE  (F.Id = 27519) AND (CF.CustomFieldTypeId <> 23) AND (CRS.CustomRecordId = 8) 
GROUP BY CFV.CustomRecordsetId 

このビューの結果に作用するクエリは次のとおりです:

SELECT P.Name, C.RecordNo, C.CFId, C.FileId, C.SFN, C.DateOpened, C.AcctNo, 
     C.AmtBilled, C.MedProvider 
FROM [dbo].[People] P, 
    [dbo].[CRSet] C 

WHERE convert(char,P.Id)= C.MedProvider 

誰もが単一のクエリにこれら二つを結合する方法を見ることができるならば、私はここで

は、ビューのクエリです助けていただければ幸いです。

+0

'GROUP BY CFV.CustomRecordsetId'をやっているときに' SELECT MAX(CFV.CustomRecordsetId) 'をしたいと思っています。ほとんどの場合、どちらか一方です。もう一つの「リスク」は、Convert(char、P.ID)は文字列ではなく、あなたが意図したとおりの文字列になるということです。例えば'Convert(varchar(50)、xx)'を実行します。 – deroby