Динамический стержень T-SQL
Хорошо У меня есть таблица, которая выглядит так:
ItemID | ColumnName | Value
1 | name | Peter
1 | phone | 12345678
1 | email | [email protected]
2 | name | John
2 | phone | 87654321
2 | email | [email protected]
3 | name | Sarah
3 | phone | 55667788
3 | email | [email protected]
Теперь мне нужно превратить это в это:
ItemID | name | phone | email
1 | Peter | 12345678 | [email protected]
2 | John | 87654321 | [email protected]
3 | Sarah | 55667788 | [email protected]
Я смотрел на динамические примеры, но, похоже, мне не удалось поместить их в мой сценарий.
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Взгляните на следующий пример
CREATE TABLE #Table (
ID INT,
ColumnName VARCHAR(250),
Value VARCHAR(250)
)
INSERT INTO #Table SELECT 1,'name','Peter'
INSERT INTO #Table SELECT 1,'phone','12345678'
INSERT INTO #Table SELECT 1,'email','[email protected]'
INSERT INTO #Table SELECT 2,'name','John'
INSERT INTO #Table SELECT 2,'phone','87654321'
INSERT INTO #Table SELECT 2,'email','[email protected]'
INSERT INTO #Table SELECT 3,'name','Sarah'
INSERT INTO #Table SELECT 3,'phone','55667788'
INSERT INTO #Table SELECT 3,'email','[email protected]'
---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.ColumnName
FROM #Table AS t
--ORDER BY '],[' + t.ID
FOR XML PATH('')
), 1, 2, '') + ']'
SELECT @cols
SET @query = N'SELECT ID,'+ @cols +' FROM
(SELECT t1.ID,t1.ColumnName , t1.Value FROM #Table AS t1) p
PIVOT (MAX([Value]) FOR ColumnName IN ( '+ @cols +' ))
AS pvt;'
EXECUTE(@query)
DROP TABLE #Table
Ответ 2
попробуйте следующее:
SQL Server 2005 +
;with
cte_name as(select * from <table> where ColumnName='name'),
cte_phone as(select * from <table> where ColumnName='phone'),
cte_email as(select * from <table> where ColumnName='email')
select n.ItemID,n.Value [Name],p.Value [Phone],e.Value [Email]
from cte_name n
join cte_phone p
on n.ItemID=p.ItemID
join cte_email e
on n.ItemID=e.ItemID
Ответ 3
Вам не нужен динамический стержень, потому что это будет другая таблица. Просто сделайте что-нибудь вроде этого:
name phone email
---------------------------------
Peter
123456
[email protected]
Отметьте скрипт SQL
SELECT DISTINCT u.ItemID, n.Value as 'name', p.Value as 'phone', e.Value as 'email'
FROM UserData u
INNER JOIN(
SELECT ItemID, Value
FROM UserData WHERE ColumnName = 'name') n ON n.ItemID = u.ItemID
INNER JOIN(
SELECT ItemID, Value
FROM UserData WHERE ColumnName = 'phone') p ON p.ItemID = u.ItemID
INNER JOIN(
SELECT ItemID, Value
FROM UserData WHERE ColumnName = 'email') e ON e.ItemID = u.ItemID
Ответ 4
Вот запрос, который я использую для моего контактного списка:)
SELECT *
FROM
(
SELECT Contact_Id AS CT
, [Age]
, [Sex]
, [State]
, [Country]
, [Keyword]
, [Married]
, [Kids]
, [Car]
FROM
(SELECT c.PropertyName
, c.ValueString
, c.Contact_Id
FROM
ContactProfiles c) AS ctp
PIVOT (max(ctp.ValueString) FOR PropertyName IN ([Age], [Sex], [State], [Country], [Keyword], [Married], [Kids], [Car])) AS PivotTable
) AS pvt
WHERE
pvt.[Age] > 18
AND (pvt.[State] = 'CA' OR pvt.[State] = 'NY')
AND pvt.[Sex] = 'F'
--*AND pvt.[Keyword] LIKE '%B;%'
AND pvt.[Married] = 'True'
AND pvt.[Kids] > 0
Ответ 5
Вы пробовали это:
SELECT ItemID, name, phone, email
FROM
(SELECT [ItemID] ,[ColumnName] ,[Value] FROM Item) Item
PIVOT (MAX(Value) FOR ColumnName IN (name, phone, email) ) as pvt