web-dev-qa-db-ja.com

SQL Server2行を1つにマージ

SSRS 2008で2つの行を1つの行にマージすることは可能ですか?各パートには、各サイトのレコードがあります

+---------------+-------+-------+
|Part Number    |Cost   |Site   |
+---------------+-------+-------+
|1              |2.4    |Site 1 |
|1              |68.8   |Site 2 |
+---------------+-------+-------+

望ましい結果

+-----------+-------+-------+
|Part Number|Site 1 |Site 2 | 
+-----------+-------+-------+
| 1         |2.4    |68.8   |
+-----------+-------+-------+

ありがとうございました

11
Spacko

サイト番号/名前が動的に変更されないことがわかっている場合は、CASE WHEN:sを使用できます

SELECT PartNumber,
MAX(CASE WHEN Site=1 THEN Cost ELSE NULL END) AS Site1_Cost,
MAX(CASE WHEN Site=2 THEN Cost ELSE NULL END) AS Site2_Cost
FROM Parts
GROUP BY PartNumber

グループ化することで、NULL値を排除しました...

ここで リンク SQLを使用Fiddle例

13
Fabio

SSRSでは、MATRIXレポートを使用して、PIVOT operatorを使用せずに行を列に変換する必要があります。

テーブルSSRSPivotがあるとします。

Create table SSRSPivot
(PartNumber int ,Cost decimal(18,2),Site varchar(max))


Insert into SSRSPivot
values
(1,2.4,'Site 1'),
(1,68.8,'Site 2' )

データは以下の形式です

+---------------+-------+-------+
|PartNumber    |Cost   |Site   |
+---------------+-------+-------+
|1              |2.4    |Site 1 |
|1              |68.8   |Site 2 |
+---------------+-------+-------+

新しい空白のレポートを作成し、PIVOTという名前を付けます。データソースを作成し、データセットにクエリを記述します

  Select PartNumber ,Cost,Site from SSRSPivot

enter image description here

matrixをツールボックスからSSRSデザイナにドラッグします。Rowsの場合はPartNumberを選択します。列の場合はSiteを選択し、データの場合はSum(Cost)を選択します。

enter image description here

上記の手順を実行すると、以下のようなrowcolumnの詳細が表示されます。

enter image description here

最終結果は次のようになります

enter image description here

2
praveen

このタイプのデータ変換は、 PIVOT として知られています。 SQL Server 2005以降、データを列に転置できる関数があります。

列に変換したい既知の数のSite値がある場合は、クエリをハードコーディングできます。

select part_number, [Site 1], [Site 2]
from 
(
  select part_number, cost, site
  from yourtable
) src
pivot
(
  sum(cost)
  for site in ([Site 1], [Site 2])
) piv;

SQL Fiddle with Demo を参照してください

ただし、値の数が不明な場合は、動的SQLを使用して、クエリで使用する列リストを生成する必要があります。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(site) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT part_number,' + @cols + ' 
             from 
             (
                select part_number, cost, site
                from yourtable
            ) x
            pivot 
            (
                sum(cost)
                for site in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo を参照してください。どちらも結果が得られます:

| PART_NUMBER | SITE 1 | SITE 2 |
---------------------------------
|           1 |    2.4 |   68.8 |
1
Taryn