假設我有 3 個表:users、customattributes 和 customattributevalues。最終用戶可以通過選擇屬性的名稱和型別來添加自定義屬性,并為任何用戶編輯值。
這是我的用戶:
| ID | 名 | 姓 | 積極的 | 創建日期 | 用戶名 | 電子郵件 |
|---|---|---|---|---|---|---|
| 3 | 艾倫 | 里普利 | 1 | 3/25/2235 | 78439 | [email protected] |
| 5 | 約翰尼 | 里科 | 1 | 4/16/2675 | 粗脖子31 | [email protected] |
自定義屬性(可以隨時添加)
| ID | 全名 | 唯一名稱 | 型別 |
|---|---|---|---|
| 1 | 雇用日期 | 雇用日期 | 日期 |
| 2 | 員工ID | 開齋節 | 整數 |
| 3 | 導師 | 導師 | nvarchar(50) |
| 4 | 指定船舶 | 委派 | nvarchar(50) |
| 5 | 職稱 | 職稱 | nvarchar(50) |
我目前擁有的型別為 sysname 資料型別。
自定義屬性值(可以隨時編輯)
| ID | 屬性id | 用戶身份 | 價值 |
|---|---|---|---|
| 1 | 1 | 3 | 2335-03-25 |
| 2 | 2 | 3 | 78439 |
| 3 | 3 | 3 | 伯克、卡特 |
| 4 | 4 | 3 | 蘇拉科 |
| 5 | 5 | 3 | 顧問 |
| 6 | 1 | 5 | 2675-04-16 |
| 7 | 2 | 5 | 78440 |
| 8 | 3 | 5 | LT Rasczak |
| 9 | 4 | 5 | 羅杰·楊 |
| 10 | 5 | 5 | 私人的 |
我目前作為sql_variant資料型別的值
所以這是我的問題:如何創建顯示所有員工及其屬性的報告,每個員工 1 行,而不知道有多少自定義屬性——而且——至關重要的是,我想明確地將每一列轉換為正確的資料型別
期望的輸出:
| 名 | 姓 | 創建日期 | 用戶名 | 電子郵件 | 雇用日期 | 員工ID | 導師 | 指定船舶 | 職稱 |
|---|---|---|---|---|---|---|---|---|---|
| 艾倫 | 里普利 | 2235-03-25 | 78439 | [email protected] | 2335-03-25 | 78439 | 伯克、卡特 | 蘇拉科 | 顧問 |
| 約翰尼 | 里科 | 2675-04-16 | 粗脖子31 | [email protected] | 2675-04-16 | 78440 | LT Rasczak | 羅杰·楊 | 私人的 |
我已經學會了使用
生成的 SQL 看起來像這樣
Select U.*
,[Hire Date]=max(case when attributeid=1 then try_convert(date,value) end)
,[Employee ID]=max(case when attributeid=2 then try_convert(int,value) end)
,[Supervisor]=max(case when attributeid=3 then try_convert(nvarchar(50),value) end)
,[Assigned Ship]=max(case when attributeid=4 then try_convert(nvarchar(50),value) end)
,[Job Title]=max(case when attributeid=5 then try_convert(nvarchar(50),value) end)
From #users U
Join #customattributesvalues V on U.ID=V.userid
Group By U.ID
,U.FirstName
,U.LastName
,U.active
,U.datecreated
,U.username
,U.email
uj5u.com熱心網友回復:
SQL_VARIANT 可以強制轉換為目標資料型別。
修改生成列串列的部分動態查詢,生成兩個串列。一個串列用于PIVOT部分,另一個串列用于SELECT您轉換資料型別的部分。
示例基于您在問題中參考的文章:
DECLARE @PivotList NVARCHAR( MAX )
DECLARE @SelectList NVARCHAR( MAX )
SELECT @SelectList = NULL, @PivotList = NULL
-- Column list with CAST e.g. CAST( eeid AS INT ) AS eeid
-- Data types come from your customattributes table
SELECT @SelectList = COALESCE( @SelectList ',','') 'CAST( ' uniquename ' AS [type] ) AS ' uniquename,
-- Just a column list that goes into PIVOT operator
@PivotList = COALESCE( @PivotList ',','') uniquename
-- Your tables for attribute values and attribute type definitions
FROM customattributes AS ca
DECLARE @SQLQuery NVARCHAR(MAX)
SET @SQLQuery =
'SELECT StudID , ' @SelectList '
FROM
( SELECT SM.StudID, S.SubjectName, SM.Score
FROM StudentMarks SM
INNER JOIN Subjects S
ON Sm.SubjectID = S.SubjectID
) AS tbl
PIVOT
( Sum(Score)
FOR SubjectName IN (' @PivotList ') ) as pvt'
EXEC(@SQLQuery)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365110.html
標籤:sql sql-server tsql dynamic pivot
上一篇:將Row中的專案垂直居中
下一篇:如何向后計算sql中的運行總數
