1

それがどのように呼び出されるかわからないので、これを行う必要があります:

+---------------+
| param | value |
|   1   |   3   |
|   1   |   3   |
|   2   |   4   |
|   2   |   4   |
+-------+-------+

+-----------------+
| param1 | param2 |
|    3   |    4   |
|    3   |    4   |
+-------+---------+

なしでも可能INNER JOINですか?

私のエラーはどこですか?

SELECT TOP 10 
    dbo.RW_ReceivedData.[Value] AS Value1, 
    dbo.RW_ReceivedData.[Value] AS Value2
FROM 
    RW_ReceivedData
WHERE 
    dbo.RW_ReceivedData.LogicalName = CAST(0x01000F0800FF AS varbinary(8000)),  
    dbo.RW_ReceivedData.LogicalName = CAST(0x01000F0800FF AS varbinary(8000))
4

1 に答える 1

1

これはうまくいくはずです:

DECLARE @cols NVARCHAR(4000) 
= STUFF(
    (
        SELECT  DISTINCT ',[' + CAST(param AS VARCHAR(10)) + ']'
        FROM    tbl
        FOR XML PATH('')
    ),1,1,'')

DECLARE @colNames NVARCHAR(4000) 
= STUFF(
    (
        SELECT  DISTINCT ',[' + CAST(param AS VARCHAR(10)) + '] AS param' + CAST(param AS VARCHAR(10))
        FROM    tbl
        FOR XML PATH('')
    ),1,1,'')

DECLARE @sql NVARCHAR(4000) = 
'
SELECT  '+@colNames+'
FROM    
(
    SELECT  *, ROW_NUMBER() OVER (PARTITION BY param ORDER BY param) n
    FROM    tbl
) t
PIVOT   
(
    MIN(value) FOR param IN ('+@cols+')
) pvt'

EXEC(@sql)

これがSQLフィドルです

このアプローチでは dynamic を使用しますPIVOT。列のROW_NUMBER()値が一意ではないため、パーティショニングで期待される結果を得るために使用されました。param

アップデート

次のように試すこともできますが、クエリに列を手動で追加する必要があります。

SELECT  SUM(CASE WHEN param = 1 THEN value ELSE 0 END) param1
        , SUM(CASE WHEN param = 2 THEN value ELSE 0 END) param2
        , SUM(CASE WHEN param = 3 THEN value ELSE 0 END) param3
FROM
    (
        SELECT  *
                , ROW_NUMBER() OVER (PARTITION BY param ORDER BY param) num
        FROM    tbl
    ) t
GROUP BY
        num

SQL フィドル

列を自動的に処理したくない場合は、 static を使用できますPIVOT

SELECT  [1] AS param1
        ,[2] AS param2  
FROM    (      
    SELECT  *
            , ROW_NUMBER() OVER (PARTITION BY param ORDER BY param) n      
    FROM    tbl) t  
PIVOT   (      
    MIN(value) FOR param IN ([1],[2])  
) pvt
于 2013-03-05T07:34:59.600 に答える