我有一个看起来像这样的源表:
+--------------+---------+------+-----------+-----------+|车辆索引 |父母 |年 |制作|模型 |+--------------+----------+------+------------+-----------+|1 |1 |2007 |丰田 |SIENNA LE ||2 |1 |2005 |大众 |捷达GLS |+--------------+----------+------+------------+-----------+我想从该表中进行选择,以便输出如下所示:
+-------+--------+---------+-------+------------+--------------+|第一年 |制作1 |型号1 |年2 |制作2 |模型2 |+-------+--------+-----------+-------+------------+-----------+|2007 |丰田 |塞拉·勒 |2005 |大众 |捷达GLS |+-------+--------+-----------+-------+------------+-----------+如何在带有数据透视表的 SQL Server 数据库上完成此操作?源表中总是有 1 或 2 辆车.如果有 1 辆车,我希望 Year2、Make2 和 Model2 为 NULL.>
类似于 SQLZim 的回答.唯一的区别是使用 Window 函数 Row_Number() 以防 vehicleindex 不是一致的 1 和 2.
Select year1 = max(case when RN=1 then [year] end),make1 = max(当RN=1时make结束),model1 = max(当RN=1时模型结束),year2 = max(当 RN=2 然后 [year] 结束的情况),make2 = max(当RN=2时make结束),model2 = max(当RN=2时模型结束)从 (选择 *,RN = Row_Number() over (Partition By parentid Order By Vehicleindex)从你的表) 一种按父ID分组<块引用>
选项 2 - 使用 PIVOT
选择*从 (选择 parentid,item = concat(B.item,Dense_Rank() over (Partition By parentid Order By Vehicleindex)),价值从你的表交叉应用 ( values ('year' ,cast(Year as varchar(100))),('制作',制作),('模型',模型)) B(项目,价值)) 一种Pivot (max(value) For [item] in ([year1],[make1],[model1],[year2],[make2],[model2]) ) pI have a source table that looks like this:
+--------------+----------+------+------------+-----------+
| vehicleindex | parentid | year | make | model |
+--------------+----------+------+------------+-----------+
| 1 | 1 | 2007 | TOYOTA | SIENNA LE |
| 2 | 1 | 2005 | VOLKSWAGEN | JETTA GLS |
+--------------+----------+------+------------+-----------+
I'd like to select from this table such that the output looks like this:
+-------+--------+-----------+-------+------------+-----------+
| year1 | make1 | model1 | year2 | make2 | model2 |
+-------+--------+-----------+-------+------------+-----------+
| 2007 | TOYOTA | SIELLA LE | 2005 | VOLKSWAGEN | JETTA GLS |
+-------+--------+-----------+-------+------------+-----------+
How can I accomplish this on a SQL Server database with a pivot? There will always be either 1 or 2 vehicles in the source table. In the case where there's 1 vehicle, I would expect Year2, Make2 and Model2 to be NULL.
Similar to SQLZim's answer. Only difference is that the Window function Row_Number() is used just in case vehicleindex is not a consistent 1 and 2.
Select year1 = max(case when RN=1 then [year] end)
,make1 = max(case when RN=1 then make end)
,model1 = max(case when RN=1 then model end)
,year2 = max(case when RN=2 then [year] end)
,make2 = max(case when RN=2 then make end)
,model2 = max(case when RN=2 then model end)
From (
Select *
,RN = Row_Number() over (Partition By parentid Order By vehicleindex)
From YourTable
) A
Group By parentid
EDIT: Option 2 - Use PIVOT
Select *
From (
Select parentid
,item = concat(B.item,Dense_Rank() over (Partition By parentid Order By vehicleindex))
,value
From YourTable
Cross Apply ( values ('year' ,cast(Year as varchar(100)))
,('make' ,make)
,('model',model)
) B (item,value)
) A
Pivot (max(value) For [item] in ([year1],[make1],[model1],[year2],[make2],[model2]) ) p
这篇关于SQL 数据透视表将行展平为列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
SQL - 过滤器值为空时全选SQL - Select all when filter value is empty(SQL - 过滤器值为空时全选)
如何以及在何处设置 MAXRECURSION 选项?How and where do I set the MAXRECURSION option?(如何以及在何处设置 MAXRECURSION 选项?)
TABLOCKX 与可序列化TABLOCKX versus SERIALIZABLE(TABLOCKX 与可序列化)
TSQL 常量...使用变量还是文字?TSQL Constants... Use Variable or Literal?(TSQL 常量...使用变量还是文字?)
TSQL RIGHT 字符串函数不起作用TSQL RIGHT String function not working(TSQL RIGHT 字符串函数不起作用)
SQL中临时表与物理表的比较速度是多少?What is the comparative speed of temporary tables to physical tables in SQL?(SQL中临时表与物理表的比较速度是多少?)