Sql server SQL Server:使用固定数量或列透视单个列
我有一个简单的查询,它带来了给定项的兄弟Sql server SQL Server:使用固定数量或列透视单个列,sql-server,pivot,Sql Server,Pivot,我有一个简单的查询,它带来了给定项的兄弟 select PC.SKU from ProdC PC where Parent_ID in (select Parent_ID from ProdC where SKU = 4536) and ParentFlag <> 'P' and SKU <> 4536 现在,每一行用于不同的项目。有些家长有2个孩子,有些家长
select
PC.SKU
from
ProdC PC
where
Parent_ID in (select Parent_ID
from ProdC
where SKU = 4536)
and ParentFlag <> 'P'
and SKU <> 4536
现在,每一行用于不同的项目。有些家长有2个孩子,有些家长最多有8个孩子,但我只想显示最多6个。有一个孩子的优先级列。我可以按desc列对其进行排序,以获得6个最新的孩子
非常感谢您的帮助。我的测试数据库中有一个表,其中每个父记录都有多个子记录,创建了以下查询以仅获取前6个子记录,但它只选择直接的子记录,如果您有其他级别的子记录,那么您可能需要查看递归CTE等
;WITH X AS
(
Select *
,ROW_NUMBER() OVER (PARTITION BY Parent_ID ORDER BY ID) rn
from TableName
),
Y AS (
Select * , 'Sib' + Cast(rn AS Varchar(10)) Sibs
FROM X
Where rn < 7
)
Select *
from
(
Select Parent_ID , Sibs , ID
FROM Y
) a
PIVOT (MAX(ID)
FOR Sibs
IN (Sib1,Sib2,Sib3,Sib4,Sib5,Sib6))p
编辑
在提供了一些示例数据之后,您的查询应该类似于
;WITH X AS
(
Select *
,ROW_NUMBER() OVER (PARTITION BY Parent_Sku ORDER BY sku) rn
from #ProdC
),
Y AS (
Select * , 'Sib' + ISNULL(NULLIF(Cast(rn -1 AS Varchar(10)), '0'),'') Sibs
FROM X
Where rn < 8
)
Select Sib1,Sib2,Sib3,Sib4,Sib5,Sib6
from
(
Select Parent_Sku , Sibs , sku
FROM Y
) a
PIVOT (MAX(sku)
FOR Sibs
IN (Sib,Sib1,Sib2,Sib3,Sib4,Sib5,Sib6,Sib7))p
这听起来像是一个交叉表,也称为条件聚合。如果您可以发布一些示例数据和表结构,那么这非常简单。没有这些细节,提供帮助是非常困难的。可能的重复基于您的问题的语言,您似乎已经知道这是一个PIVOT查询,那么为什么不在SQL中简单地使用PIVOT命令呢?如果你自己做过任何研究,请将其添加到你的问题中。这是一个示例表。我不想带父记录,只想列出同一父的子项,每行最多6个。这是我的示例表sqlfiddle.com/#!3/6a096M。阿里,非常感谢你的帮助。因此,如果我要在存储过程中使用它,并希望返回给定子SKU的所有同级,您认为我应该如何在变量中提供它并返回给定SKU的所有同级?例如,此查询将4536作为输入,并提供4532453945484552456164562作为结果集。我已经用正确的源表和数据更新了sqlfiddle表。对于您在这里提出的问题,您需要接受这个答案,然后单独问另一个问题。
+----------+------+------+------+------+-------+------+
| ParentID | Sib1 | Sib2 | Sib3 | Sib4 | Sib5 | Sib6 |
+----------+------+------+------+------+-------+------+
| 0 | 0 | 139 | 258 | 266 | 285 | 500 |
| 139 | 140 | 141 | 142 | 143 | 144 | 162 |
| 142 | 5062 | 5063 | NULL | NULL | NULL | NULL |
| 143 | 5041 | 5042 | 5043 | 5044 | 5045 | 5046 |
| 144 | 5050 | 5051 | 5052 | 5053 | 5054 | 5055 |
| 258 | 5823 | 5824 | 5825 | 5826 | 11269 | NULL |
| 266 | 5822 | 5912 | 5913 | 5914 | 5915 | 5916 |
| 285 | 2139 | 3855 | 4172 | 4173 | NULL | NULL |
+----------+------+------+------+------+-------+------+
;WITH X AS
(
Select *
,ROW_NUMBER() OVER (PARTITION BY Parent_Sku ORDER BY sku) rn
from #ProdC
),
Y AS (
Select * , 'Sib' + ISNULL(NULLIF(Cast(rn -1 AS Varchar(10)), '0'),'') Sibs
FROM X
Where rn < 8
)
Select Sib1,Sib2,Sib3,Sib4,Sib5,Sib6
from
(
Select Parent_Sku , Sibs , sku
FROM Y
) a
PIVOT (MAX(sku)
FOR Sibs
IN (Sib,Sib1,Sib2,Sib3,Sib4,Sib5,Sib6,Sib7))p
| Sib1 | Sib2 | Sib3 | Sib4 | Sib5 | Sib6 |
|------|------|------|--------|--------|--------|
| 4532 | 4536 | 4539 | 4548 | 4552 | (null) |
| 3512 | 3536 | 4561 | 4562 | (null) | (null) |
| 5632 | 5636 | 5640 | (null) | (null) | (null) |