2016-08-15 64 views
0

我的報頭信息這下表:如何在SQL服務器數據透視表中獲取動態不同類型的數據類型值的

InformationID Name    DispalyName       VAlueType 
1    Occupation   Occupation       Text 
3    Surgery   Surgery        Header 
4    SurgeryType  SurgeryType       Text 
5    SurgeryDate  SurgeryDate       Datetime 
8    Rehabilitation  Rehabilitation      Header 
9    RehabilitationPT Rehabilitation Physiotherapist  Text 
10    RehabilitationDate Rehabilitation Date     DateTime 
11    DischargeSession Discharge Session Number   int 
12    Height    Height        decimal 
13    Weight    Weight        decimal 

I have another table has all these rows values stored like this: 

InfomationID ClientID TextValue   NumberValue  DateValue 
1    XXXX  Programmer   null   null 
4    XXXX  Left knee surgery null   null 
5    XXXX  null    null   2016-08-01 01:00:00 
11   XXXX  null    6    null 
12   XXXX  null    164.592   null 

現在我需要讓那些在一個子查詢與在客戶端ID = XXXX 結果的一部分將是以下的東西:

CFname| CLname| Occupation| SurgeryType  | SurgeryDate| DischargeSession 
------------------------------------------------------------------------------- 
CFName| CLname| Programmer| Left knee surgery| 2016-08-01 | 6 
:::: 
:::: 
More records 

問候

+0

爲什麼6 DischargeSession?沒有足夠的信息提供任何類似於答案的東西。爲什麼是手術日期而不是其他日期?這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/你在這裏掙扎的原因是因爲你有一種反模式稱爲實體值屬性(EAV)。看起來很酷,但通常與合作太痛苦。 –

回答

0

你只需要轉換的數量和日期值爲varchar ..你CA n使用合併獲取第一個非空值。

你的支點會看起來像這樣

SELECT * 
FROM (
     SELECT c.CFName, 
       c.CLName, 
       fh.Name, 
       COALESCE(fv.TextValue, 
         CAST(fv.NumberValue AS VARCHAR(50)), -- convert numbers to text 
         CONVERT(VARCHAR(10), fv.DateValue, 101) AS DynamicValue -- convert date to text 
                       -- increase varchar length for time 
                       -- or 101 for different format 
     FROM ClientInfo c 
     JOIN FieldValues fv ON c.ClientID = fv.ClientID 
     JOIN FieldHeaders fh ON fh.InformationID = fv.InformationID 
) t 
PIVOT (
    MAX(DynamicValue) 
    FOR fh.Name IN ([Occupation], [SurgeryType], [SurgeryDate], [DischargeSession]) 
) p 

做到這一點動態,你會需要使用STUFF選擇數值爲nvarchar的建立你的SQL和注入樞軸列到SQL(FOR XML)

DECLARE @Sql NVARCHAR(MAX), 
     @Columns NVARCHAR(MAX) 

SELECT @Columns = STUFF((
         SELECT ',' + QUOTENAME(Name) 
         FROM FieldHeaders 
         FOR XML PATH('') 
        ), 1, 1, 0) 
SET  @Sql = N' 
    SELECT * 
    FROM (
      SELECT c.CFName, 
        c.CLName, 
        fh.Name, 
        COALESCE(fv.TextValue, 
          CAST(fv.NumberValue AS VARCHAR(50)), -- convert numbers to text 
          CONVERT(VARCHAR(10), fv.DateValue, 101) AS DynamicValue -- convert date to text 
                        -- increase varchar length for time 
                        -- or 101 for different format 
      FROM ClientInfo c 
      JOIN FieldValues fv ON c.ClientID = fv.ClientID 
      JOIN FieldHeaders fh ON fh.InformationID = fv.InformationID 
    ) t 
    PIVOT (
     MAX(DynamicValue) 
     FOR fh.Name IN (' + @Columns + ') 
    ) p 
' 
EXEC(@Sql) 
+0

感謝您的回覆。需要做轉換數據。很好的幫助。 –

相關問題