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) |