拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 SQLPIVOT不像怀疑的那样

SQLPIVOT不像怀疑的那样

白鹭 - 2022-03-02 2127 0 0

到目前为止,我正在对多个表进行资料提取,我有这个

表 A

ID 价值
1 123

表 B

ID 档案ID 栏位ID 援助 资料
1 1 1 1 美国广播公司
2 1 2 1 123
3 1 3 1 真的
4 1 1 2 定义
5 1 2 2 456
6 1 3 2 错误的

到目前为止我有

SELECT Id, Plate, [1] as field1, [2] as field2, [3] as field3 FROM 
   (SELECT A.Id, A.value , B.Data as datavalue, B.Id as dataid
    FROM TableA A, TableB B 
    WHERE A.Id = B.A_ID)as P


PIVOT (MAX(dataid) FOR datavalue in ([1],[2],[3])) as  PVT

我期待的答案

ID 价值 栏位1 栏位2 栏位3
1 123 美国广播公司 123 真的

我得到的答案

ID 价值 栏位1 栏位2 栏位3
1 123 空值 空值 空值

我错过了什么

想不通

uj5u.com热心网友回复:

您需要 LEFT JOIN 从:表 B 到表 A 而不是表 A 到表 B

在嵌套选择中切换两个表。

uj5u.com热心网友回复:

使用Group byMax功能并将枢轴代码更改为:

PIVOT (MAX(datavalue) FOR datavalue in ([abc],[123],[TRUE])) AS  PVT

SELECT Id, 
       value, 
       max([abc]) as field1,
       max([123]) as field2,
       max([TRUE]) as field3 
FROM 
   (SELECT A.Id, A.value , B.Data AS datavalue, B.Id AS dataid
    FROM TableA A, TableB B 
    WHERE A.Id = B.A_ID) AS P


PIVOT (MAX(datavalue) FOR datavalue in ([abc],[123],[TRUE])) AS  PVT
GROUP BY id,value

db<>fiddle 中的演示

uj5u.com热心网友回复:

我相信您的意思是 B.FieldId 而不是 B.Id。除此之外,您需要稍作修改(您的 dataId 和 dataValue 错误,它会是

... Max(datavalue) for dataId in ...

代替

... Max(dataId) for dataValue in ...

这是修订版:

SELECT
  ID, PVT.value, [1] AS field1, [2] AS field2, [3] AS field3
FROM
  (
    SELECT
         A.ID, A.value, B.Data AS datavalue, B.FieldId AS dataid
    FROM TableA            A
         INNER JOIN TableB B ON A.ID=B.A_ID
  ) AS P
PIVOT(MAX(datavalue)
FOR dataid IN([1], [2], [3])
     ) AS PVT;

这是DBFiddle 演示。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *