我有两个表命名PRODUCT
和DETAIL
TABLE: PRODUCT
slno product
1 x
2 y
3 z
TABLE: DETAIL
product detail
x good
y bad
z worse
x bad
我需要获得输出
TABLE
X Y Z
good bad worse
bad
此数据转换称为A PIVOT
,从SQL Server 2005开始,具有将数据从行转换为列的功能。
有多种方法可以完成此操作,具体取决于您是否有要转换为列的静态数量的值。所有这些都涉及向row_number()
数据添加a
,因此您可以返回任何产品的多行。
您可以将聚合函数与CASE
表达式一起使用:
select
max(case when product = 'x' then detail end) x,
max(case when product = 'y' then detail end) y,
max(case when product = 'z' then detail end) z
from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) src
group by rn
参见带有演示的SQL Fiddle
您可以使用以下PIVOT
功能:
select x, y, z
from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) src
pivot
(
max(detail)
for product in (x, y, z)
) piv
请参阅带有演示的SQL Fiddle。
如果您有未知数量的值(在这种情况下为产品)要转换为列,那么您将要使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(product)
from product
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) x
pivot
(
max(detail)
for product in (' + @cols + ')
) p '
execute(@query)
参见带有演示的SQL Fiddle
所有查询的结果是:
| X | Y | Z |
--------------------------
| good | bad | worse |
| bad | (null) | (null) |
问题内容: 我在表中有数据,如下所示: 我想编写一个SQL查询,以便给出如下结果: 问题答案: Oracle 9i +支持: 您只列出了两列-可能应按年份将类似的内容分组。 有ANSI PIVOT(和UNPIVOT)语法,但是Oracle直到11g才支持它。在9i之前,您必须将CASE语句替换为Oracle特定的DECODE。
问题内容: 我正在寻找一种方法来调整以下结果… 分为以下结构。 列数是固定的(它将始终是部门/部门/类别)。该查询适用于Sybase。。。尚无法弄清楚如何实现这种转换。有什么建议吗? 问题答案: 您需要一些键来定义3行的集合。然后,您就可以自我加入 所以对于这样的数据… 你会
问题内容: 有什么方法可以创建 查询参数 以在JavaScript中执行 GET请求 吗? 就像在Python中一样,它具有一个字典(或两个元组的列表)并创建一个类似的字符串。 问题答案: 干得好: 用法:
问题内容: 我不确定这是否称为“透视”。 我的SQL 2005表 [CustromerRoles]中的数据 是这样的: [角色] 表: 我想创建一个这样的视图: SELECT * FROM [MYVIEW]将为我提供以下数据: 1和0将是位,因此我可以在UI显示屏上显示带有复选框的网格。 到目前为止,我还不知道如何去做。 问题答案: 试试这个: 经过测试。它给出您想要的相同结果。
问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它:
在Laravel 4中,当使用4.2文档中描述的多对多关系时,我如何让Laravel为我创建透视表? 我是否需要在我的迁移中为所涉及的两个模型添加一些东西?是否需要手动创建数据透视表的迁移?或者Laravel如何知道创建透视表? 到目前为止,我所做的一切就是将