【发布时间】:2014-06-12 14:08:37
【问题描述】:
我有两个表“Controls”和“ControlChilds”
父表结构:
Create table Controls(
ProjectID Varchar(20) NOT NULL,
ControlID INT NOT NULL,
ControlCode Varchar(2) NOT NULL,
ControlPoint Decimal NULL,
ControlScore Decimal NULL,
ControlValue Varchar(50)
)
样本数据
ProjectID | ControlID | ControlCode | ControlPoint | ControlScore | ControlValue
P001 1 A 30.44 65 Invalid
P001 2 C 45.30 85 Valid
子表结构:
Create table ControlChilds(
ControlID INT NOT NULL,
ControlChildID INT NOT NULL,
ControlChildValue Varchar(200) NULL
)
样本数据
ControlID | ControlChildID | ControlChildValue
1 100 Yes
1 101 No
1 102 NA
1 103 Others
2 104 Yes
2 105 SomeValue
对于给定的 ProjectID,输出应位于单行中,其所有 Control 值在前,然后是子控件值(基于 ControlCode(即)ControlCode_Child (1, 2, 3...),它应该看起来像这个
另外,我尝试了这个 PIVOT 查询,我能够获取 ChildControls 表的值,但我不知道如何获取 Controls 表的值。
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT
distinct ',' +
QUOTENAME(ControlCode + '_Child' + CAST(ROW_NUMBER() over(PARTITION BY ControlCode ORDER BY ControlChildID) AS Varchar(25)))
FROM Controls C
INNER JOIN ControlChilds CC
ON C.ControlID = CC.ControlID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query ='SELECT *
FROM
(
SELECT
(ControlCode + ''_Child'' + CAST(ROW_NUMBER() over(PARTITION BY ControlCode ORDER BY ControlChildID) AS Varchar(25))) As Code,
ControlChildValue
FROM Controls AS C
INNER JOIN ControlChilds AS CC ON C.ControlID = CC.ControlID
) AS t
PIVOT
(
MAX(ControlChildValue)
FOR Code IN( ' + @cols + ' )' +
' ) AS p ; ';
execute(@query);
我得到的输出:
谁能帮助我了解如何获取每个 ControlChilds 表值前面的 Controls 表值?
【问题讨论】:
-
Controls.ProjectID被定义为INT但它的值是P001,哪一个是正确的? -
好收获!它是一个错字,应该是 varchar。
-
您是否尝试过先将其编写为静态版本以使逻辑正确?这有时比尝试立即解决动态枢轴要容易得多。
-
@bluefeet:不。我没有尝试过,但根据一些样本我这样做了。另外,我真的很困惑如何将两个表转换为一行。
标签: sql sql-server-2008 pivot