1

我有一个 SQL Server 请求来获取一个包含所有文章功能的表:

SELECT     
   tartikel.cArtNr AS ID, 
   tMerkmal.cName AS Feature, 
   tMerkmalWertSprache.cWert AS FeatureValue
FROM         
   tartikel 
INNER JOIN
   tArtikelMerkmal ON tartikel.kArtikel = tArtikelMerkmal.kArtikel 
INNER JOIN
   tMerkmal ON tArtikelMerkmal.kMerkmal = tMerkmal.kMerkmal 
INNER JOIN
   tMerkmalWertSprache ON tArtikelMerkmal.kMerkmalWert = tMerkmalWertSprache.kMerkmalWert
WHERE     
   (tMerkmalWertSprache.kSprache = '1')

我得到这样的结果:

ID | FeatureName | FeatureValue
--------------------------------
1  | Feature 1   | Value a
1  | Feature 2   | Value a
1  | Feature 2   | Value b
1  | Feature 2   | Value c
1  | Feature 3   | Value a

但我想对FeatureName不同列中的值进行分组。

像这样:

ID | FeatureName | FeatureValue 1 | FeatureValue 2 | FeatureValue 3
-------------------------------------------------------------------
1  | Feature 1   | Value a        |                |
1  | Feature 2   | Value a        | Value b        | Value c
1  | Feature 3   | Value a        |                |

如何修改我的请求以获取按排序的表格FeatureName

4

1 回答 1

5

您可以使用 SQL Server 的PIVOT函数来获取结果:

select id, feature, FeatureValue_1, FeatureValue_2, FeatureValue_3
from
(
  SELECT tartikel.cArtNr AS ID, 
    tMerkmal.cName AS Feature, 
    tMerkmalWertSprache.cWert AS FeatureValue,
    'FeatureValue_'+cast(row_number() over(partition by tartikel.cArtNr, tMerkmal.cName
                                           order by tMerkmal.cName) as varchar(10)) seq
  FROM tartikel 
  INNER JOIN tArtikelMerkmal 
    ON tartikel.kArtikel = tArtikelMerkmal.kArtikel 
  INNER JOIN tMerkmal 
    ON tArtikelMerkmal.kMerkmal = tMerkmal.kMerkmal 
  INNER JOIN tMerkmalWertSprache 
    ON tArtikelMerkmal.kMerkmalWert = tMerkmalWertSprache.kMerkmalWert
  WHERE tMerkmalWertSprache.kSprache = '1'
) d
pivot
(
  max(FeatureValue)
  for seq in (FeatureValue_1, FeatureValue_2, FeatureValue_3)
) piv;

如果每个 Id 的 FeatureValues 数量未知,则可以使用动态 SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' 
                        + QUOTENAME('FeatureValue_'+cast(row_number() over(partition by tartikel.cArtNr, tMerkmal.cName
                                                     order by tMerkmal.cName) as varchar(10))) 
                    FROM tartikel 
                    INNER JOIN tArtikelMerkmal 
                      ON tartikel.kArtikel = tArtikelMerkmal.kArtikel 
                    INNER JOIN tMerkmal 
                      ON tArtikelMerkmal.kMerkmal = tMerkmal.kMerkmal 
                    INNER JOIN tMerkmalWertSprache 
                      ON tArtikelMerkmal.kMerkmalWert = tMerkmalWertSprache.kMerkmalWert
                    WHERE tMerkmalWertSprache.kSprache = '1'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, feature,' + @cols + ' 
             from 
             (
                SELECT tartikel.cArtNr AS ID, 
                  tMerkmal.cName AS Feature, 
                  tMerkmalWertSprache.cWert AS FeatureValue,
                  ''FeatureValue_''+cast(row_number() over(partition by tartikel.cArtNr, tMerkmal.cName
                                                         order by tMerkmal.cName) as varchar(10)) seq
                FROM tartikel 
                INNER JOIN tArtikelMerkmal 
                  ON tartikel.kArtikel = tArtikelMerkmal.kArtikel 
                INNER JOIN tMerkmal 
                  ON tArtikelMerkmal.kMerkmal = tMerkmal.kMerkmal 
                INNER JOIN tMerkmalWertSprache 
                  ON tArtikelMerkmal.kMerkmalWert = tMerkmalWertSprache.kMerkmalWert
                WHERE tMerkmalWertSprache.kSprache = ''1''
            ) x
            pivot 
            (
                max(FeatureValue)
                for seq in (' + @cols + ')
            ) p '

execute(@query)
于 2013-06-20T21:44:31.090 回答