2014-02-25 32 views
2

我有一個相當大的報告,我正在處理,事實證明,我需要保險信息在1行而不是3行。我可以通過SQL編碼與基礎知識,但是當涉及到數據透視表和其他先進的任務,我陷入困境,它變得混亂,所以我想我會轉向你們。我看了幾個將行更改爲列的例子,並開始理解它,但是當涉及到實際編碼時,它開始變成一團糟。 :(Microsoft SQL Server:將3行轉換爲3列

ISSUE
試圖讓所有3個險一排,而不是打印新行,並與所有重複的患者數據的每個保險

EXAMPLE 
TYPE ACCTNUM_2 PaySrc_1 
2  000001  MEDICARE 
2  000001  BLUE CROSS 
2  000152  BLUE CROSS 

I would like to display it as 
TYPE ACCTNUM_2 ... PaySrc_1 PaySrc_2 PaySrc3 
2  000001  MEDICARE BLUE CROSS 
2  000152  BLUE CROSS 

CODE:

DECLARE 
    @StartDate DateTime, 
    @EndDate DateTime, 
    SET @StartDate = '10/28/2013 00:00:000' 
    SET @EndDate = '10/28/2013 23:59:000' 
    SET @RecordType = '2' 

SELECT 
    @RecordType AS RecordType 
    ,ISNULL(AbstractData.AccountNumber,'') AS AcctNum 
    ,ISNULL(AbsInsurances.InsuranceName,'') AS PaySrc_1 
FROM AbstractData 
    JOIN AbsInsurances 
     ON (AbsInsurances.VisitID = AbstractData.VisitID) 
     AND (AbsInsurances.SourceID = AbstractData.SourceID) 


WHERE AbstractData.DischargeDateTime BETWEEN '05/15/2012 00:00:000' and '08/15/2012 00:00:000' 
ORDER BY AbstractData.DischargeDateTime, 
AbstractData.PatientID 
+0

你不是指列到行嗎? – Mihai

+0

如果您有需要替代的地方,我會很樂意將其刪除。現在,如果我刪除這兩個字段,第12欄和第13欄將被刪除,並且如上所述,我需要爲PaySrc 12,13和14列中的患者列出所有三項保險。 – Rich

+0

您的示例很奇怪,您在列' PaySrc_12'並且想要將它們分配在三列12到14中? – Smutje

回答

1

使用子查詢工作的罰款和顯示的數據根據​​需要跨越:

,(SELECT ISNULL(AI.InsuranceName,'') 
    FROM AbsInsurances AI 
    WHERE AI.InsuranceSeqID ='1' AND (AI.VisitID = AbstractData.VisitID)) 
    AS PaySrc_12 
,(SELECT ISNULL(AI.InsuranceName,'') 
    FROM AbsInsurances AI 
    WHERE AI.InsuranceSeqID ='2' AND (AI.VisitID = AbstractData.VisitID)) 
    AS PaySrc_13 
,(SELECT ISNULL(AI.InsuranceName,'') 
    FROM AbsInsurances AI 
    WHERE AI.InsuranceSeqID ='3' AND (AI.VisitID = AbstractData.VisitID)) 
    AS PaySrc_14 

感謝所有誰回答。

1

根據解釋和示例代碼,很難理解爲什麼你想在T-SQL中嘗試這樣做,如果有可用的報告工具,請嘗試改爲使用它。

有一種連接名稱列表的方法,但您必須犧牲您提出的報告結構(略)。考慮連接AbsInsurances.PaySrc_12中的值。這裏有一段你可能會爲你工作的片段。如果你確實得到它的工作,我強烈建議你將它用作臨時解決方案,直到找到更實用/可維護的方法。

SELECT DISTINCT ACCTNUM_2, STUFF(InsuranceProviders.Names, 1, 1, '') PAYSRC_12 
FROM AbstractData t 
     CROSS APPLY (
        SELECT ',' + PaySrc_12 
        FROM AbstractData 
        WHERE ACCTNUM_2 = t.ACCTNUM_2 
        FOR XML PATH('') 
        )InsuranceProviders(Names) 
    WHERE ACCTNUM_2='000001' 
+1

謝謝rcjames。最後我用下面的代碼和它的工作 (SELECT ISNULL(AI.InsuranceName, '') FROM AbsInsurances AI WHERE AI.InsuranceSeqID = '1' AND(AI.VisitID = AbstractData.VisitID)) AS PaySrc_12 ,(SELECT ISNULL(AI。InsuranceName, '') FROM AbsInsurances AI WHERE AI.InsuranceSeqID = '2' AND(AI.VisitID = AbstractData.VisitID)) AS PaySrc_13 ,(SELECT ISNULL(AI.InsuranceName, '') FROM AbsInsurances AI WHERE AI.InsuranceSeqID ='3'AND(AI.VisitID = AbstractData.VisitID)) AS PaySrc_14 – Rich