2013-03-26 10 views
8

Czy można scalić 2 wiersze w jeden wiersz w SSRS 2008? Każda część będzie mieć zapis dla każdej witrynySQL Server Scalenie 2 wierszy w 1

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

pożądanego rezultatu

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

Dziękuję

+0

Będziesz musiał znaleźć informacje o zapytaniach CROSS TAB. – Prasanna

Odpowiedz

10

Jeśli znasz swoje numery site/nazwy nie zmienia się dynamicznie, a następnie można użyć 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 

Grupując wyeliminowaliśmy wartości NULL. ..

Tutaj link z przykładu SQL Fiddle

+0

Dziękuję za pomoc, to proste rozwiązanie rozwiązało problem – Spacko

+0

jeśli chcę, aby wszystkie rekordy zostały przesunięte nie tylko o maksymalny czas, co powinienem zrobić – Strikers

1

Ten rodzaj transformacji danych jest znany jako PIVOT. Począwszy od SQL Server 2005, istnieje funkcja, która może przetransponować dane do kolumn.

Jeśli masz znaną liczbę Site wartości, które chcesz włączyć do kolumn, możesz ciężko Kod zapytania:

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; 

Zobacz SQL Fiddle with Demo

Ale jeśli masz nieznaną liczbę wartości, a następnie trzeba będzie użyć dynamicznego SQL, aby wygenerować listę kolumn mają być stosowane w zapytaniu:

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) 

See SQL Fiddle with Demo. Zarówno dadzą wynik:

| PART_NUMBER | SITE 1 | SITE 2 | 
--------------------------------- 
|   1 | 2.4 | 68.8 | 
+0

Dziękuję bardzo za rozwiązanie – Spacko

0

W SSRS do trzeba użyć MATRIX raport konwersji wierszy do kolumn bez używania PIVOT operator

Załóżmy, że masz stolik 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') 

danych jest w poniższym formacie:

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

Utwórz nowy pusty raport i nazwij go jako PIVOT .Create do źródła danych w zbiorze danych napisać kwerendę

Select PartNumber ,Cost,Site from SSRSPivot 

enter image description here

Przeciąganie matrix z przybornika na SSRS designer.For Rows wybrać PartNumber.Dla kolumny wybrać Site i dane wybierz Sum(Cost)

enter image description here

Po wykonaniu powyższego kroku, dostaniesz row i column dane jak poniżej

enter image description here

końcowy wynik będzie Wygląda tak, jakby

enter image description here