4

興味深い方法で非正規化する必要があるクエリがあります。

ソースは次のとおりです。

SELECT
  BILL_Invoice.Invoice_Number as AccountNumber,
  replace(convert(varchar(10), dbo.BILL_Invoice.Invoice_Date,101) ,'/','') as AdmitDate,
  BILL_InvoiceCPT.InvoiceCPT_Code AS CPTCode,
  InvoiceCPT_FeeAmount as ItemCharge
FROM
  dbo.BILL_InvoiceCPT 
  LEFT JOIN dbo.BILL_Invoice
  ON dbo.BILL_InvoiceCPT.Invoice_ID = dbo.BILL_Invoice.Invoice_ID

出力は次のようになります。

AccountNumber | AdmitDate  | CPTCode | ItemCharge
38689         | 02192013   | 99213   |     110.00
38689         | 02192013   | 80053   |       0.00
38689         | 02192013   | 86361   |       0.00
38689         | 02192013   | 85025   |       0.00
38689         | 02192013   | 87536   |       0.00
38689         | 02192013   | 93000   |      25.00

私が必要なのは:

AccountNumber | AdmitDate | TotalCharges | CPTCodes                            | ItemCharges
38689         | 02192013  | 135.00       | 99213;80053;86361;85025;87536;93000 | 110.00;0.00;0.00;0.00;0.00;25.00

これは、サードパーティ ソフトウェア アプリケーションへの入力に必要です。この情報を正しく非正規化する方法がよくわかりません。PIVOT関数はこれを行いますか?

4

2 に答える 2

5

MySQL にはGROUP_CONCATと呼ばれるこのための準備が整った関数があります。

次のようになります。

SELECT 
 AccountNumber
,AdmitDate
,SUM(TotalCharges)
,GROUP_CONCAT(CPTCode)
,GROUP_CONCAT(ItemCharges)
FROM tbl
WHERE condition
GROUP BY AccountNumber, AdmitDate
于 2013-02-20T16:42:43.640 に答える
2

集計文字列の連結を行う必要があります。これは、SQL Server の苦痛です。結果は次のようになります。

with t as (
      SELECT bi.Invoice_Number as AccountNumber, 
             replace(convert(varchar(10), bi.Invoice_Date,101) ,'/','') as AdmitDate,
             InvoiceCPT_FeeAmount as TotalCharges,
             biCPT.InvoiceCPT_Code AS CPTCode, 
             InvoiceCPT_FeeAmount as ItemCharge
      FROM dbo.BILL_InvoiceCPT bicpt LEFT JOIN
           dbo.BILL_Invoice bi
           ON bicpt.Invoice_ID = bi.Invoice_ID
    )
select accountNumber, admitDate,
       STUFF((select ',' + CAST(totalCharges as varchar(255))
              from t
              where t.AccountNumber = t2.AccountNumber
              for xml path ('')
             ), 1, 1, '') as TotalCharges,
       STUFF((select ',' + CAST(itemCharge as varchar(255))
              from t
              where t.AccountNumber = t2.AccountNumber
              for xml path ('')
             ), 1, 1, '') as ItemCharges
from (select distinct accountNumber, admitDate
      from t
     ) t2

注: この SQL はテストしていないため、構文エラーがある可能性があります。

于 2013-02-20T16:30:03.743 に答える