T-SQL动态枢轴
好的,我有一张这样的桌子T-SQL动态枢轴,sql,sql-server,tsql,dynamic,pivot,Sql,Sql Server,Tsql,Dynamic,Pivot,好的,我有一张这样的桌子 ItemID | ColumnName | Value 1 | name | Peter 1 | phone | 12345678 1 | email | peter@host.com 2 | name | John 2 | phone | 87654321 2 | email | john@host.com 3 | name
ItemID | ColumnName | Value
1 | name | Peter
1 | phone | 12345678
1 | email | peter@host.com
2 | name | John
2 | phone | 87654321
2 | email | john@host.com
3 | name | Sarah
3 | phone | 55667788
3 | email | sarah@host.com
现在我需要把它变成这样:
ItemID | name | phone | email
1 | Peter | 12345678 | peter@host.com
2 | John | 87654321 | john@host.com
3 | Sarah | 55667788 | sarah@host.com
我一直在看动态轴心示例,但似乎我无法将它们应用到我的场景中
有人能帮忙吗?这里是我用来查询联系人列表的查询:
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
请看下面的示例
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','peter@host.com'
INSERT INTO #Table SELECT 2,'name','John'
INSERT INTO #Table SELECT 2,'phone','87654321'
INSERT INTO #Table SELECT 2,'email','john@host.com'
INSERT INTO #Table SELECT 3,'name','Sarah'
INSERT INTO #Table SELECT 3,'phone','55667788'
INSERT INTO #Table SELECT 3,'email','sarah@host.com'
---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
您不需要动态透视,因为它将是一个不同的表。只需这样做:
name phone email
---------------------------------
Peter
123456
peter@host.com
检查这个
试试这个:
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
你试过这个吗:
SELECT ItemID, name, phone, email
FROM
(SELECT [ItemID] ,[ColumnName] ,[Value] FROM Item) Item
PIVOT (MAX(Value) FOR ColumnName IN (name, phone, email) ) as pvt
我看不到你的数据中有什么支点。您在第一个块中以奇数的方式列出了常规列名和值,通常在第二个块中列出。如果第一个块表示您的实际数据,那么为什么它是这样存储的而不是标准化的?为什么您需要此数据的动态透视?这可以通过静态轴心检查我的答案来实现。是因为您希望ColumnName具有除name、phone和email以外的值吗?是的,ColumnName和列数将更改。我应该提到这一点。同样的原因是数据没有标准化。非常感谢,这正是我想要的!问题是列名是动态的。它们的名称和列数都会不同。问题是列名称是动态的。它们的名称和列数都将不同。
SELECT ItemID, name, phone, email
FROM
(SELECT [ItemID] ,[ColumnName] ,[Value] FROM Item) Item
PIVOT (MAX(Value) FOR ColumnName IN (name, phone, email) ) as pvt