2013-02-20 2 views
0

흥미로운 방식으로 비정규 화해야하는 쿼리가 있습니다.SQL 질의 비정규 화 및 열 결합

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 함수가이 작업을 수행합니까?

+3

어떤 데이터베이스를 사용하고 있습니까? –

+0

MSSQL Standard Edition (64 비트) 10.0.2531.0 – ajspacemanspiff

+0

"dbo"를 기반으로 가정 한 내용입니다. 통사론. 아래의 내 솔루션이이 데이터베이스에서 작동해야합니다. –

답변

1

집계 문자열 연결을 수행해야합니다. 이것은 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을 테스트하지 않았습니다.

+0

아, downvote 주셔서 감사합니다. 아무도 그 문제가 무엇인지 설명 할 수 있습니까? –

4

MySQL에는 GROUP_CONCAT이라는 준비 기능이 있습니다!

그것은 다음과 같이 보일 것입니다 : PostgreSQL의에서

SELECT 
AccountNumber 
,AdmitDate 
,SUM(TotalCharges) 
,GROUP_CONCAT(CPTCode) 
,GROUP_CONCAT(ItemCharges) 
FROM tbl 
WHERE condition 
GROUP BY AccountNumber, AdmitDate 
0

당신은 string_agg() 기능과 드 정상화를위한 GROUP BY 절을 사용합니다. SUM()을 사용하여 총 요금을받을 수도 있습니다. 어떤

SELECT string_agg("CPTCode", ';'), SUM("TotalCharges"), ... 
FROM dbo.BILL_InvoiceCPT LEFT JOIN dbo.BILL_Invoice 
ON dbo.BILL_InvoiceCPT.Invoice_ID = dbo.BILL_Invoice.Invoice_ID 
GROUP BY "AccountNumber" 

를 들어 거기에 GROUP BY 절없이이 작업을 수행 할 수있는 방법도없고, 집계 함수는 당신의 친구입니다.