主表
Code UserName
1 UserOne
2 UserTwo
3 UserThree
详细信息表
Code UserCode ParamName ParamValue
1 1 NameOne ValueOne
1 1 NameTwo ValueTwo
1 1 NameThree ValueThree
等等
以上是我的主人和详细信息表。我想编写一个查询,将详细信息表的行转换为列。所需的输出如下:
Code UserCode NameOne NameTwo NameThree and so on
1 1 ValueOne ValueTwo ValueThree and so on
我怎样才能做到这一点?任何建议都会提前很好。
答案 0 :(得分:0)
这是一个常见的问题,不知道任何关于BDMS的使用,我建议两个低级解决方案:
通过subselect添加列包括添加子选择以获取每个dato,您需要将其转换为列。
通过JOIN添加列包括向数据添加左连接(白方右侧数据剪切),将所需的广告公开字段添加到列中。
这些解决方案都是静态的,只有在具有固定数量的traspsose列时才有效。让dinamy可以介绍商店程序的方法。
答案 1 :(得分:0)
我希望以下查询可以帮助您实现您想要的目标
SELECT DISTINCT
(SELECT ParamValue FROM tblDetails WHERE ParamName ='TestOne' AND UserCode = tb.UserCode) AS TestOne,
(SELECT ParamValue FROM tblDetails WHERE ParamName ='TestTwo' AND UserCode = tb.UserCode) AS TestTwo,
(SELECT ParamValue FROM tblDetails WHERE ParamName ='TestThree' AND UserCode = tb.UserCode) AS TestThree
FROM tblDetails tb
或者如果ParamName可以包含许多无法提前保证的值,则可以使用PIVOT
。
答案 2 :(得分:0)
一些一般/共同的策略......
您可以使用PIVOT查询...
您可以使用CASE(TSQL)或DECODE(PLSQL)类型的语句...
SELECT
...
CASE Parmname WHEN 'NameOne' THEN [ValueOne] ELSE '' END as NameOne,
CASE Parmname WHEN 'NameTwo' THEN [ValueTwo] ELSE '' END as NameTwo
...
您可以使用DERIVED TABLES ...
SELECT
...
N1.Parmname,
N2.Parmname,
...
FROM
...
LEFT JOIN (SELECT * FROM tbl_Detail WHERE Parmname = 'NameOne') N1
ON...
LEFT JOIN (SELECT * FROM tbl_Detail WHERE Parmname = 'NameTwo') N2
...
...诸如此类