2014-06-23 13 views
5

Mam dwie tabele Contact i Invoice połączone ContactIdwybierz oświadczenie grupy o łącznej

proszę zobaczyć fiddle

ja wybierając wszystkie kontakty, którzy mają wydać więcej niż 2500 za każdy rok i kwerenda działa poprawnie .

Chciałem, aby wyświetlało się w poniższym formacie. enter image description here

Każda pomoc w tym zakresie wymaga użycia numeru sql-server. I łatwo można to zrobić za pomocą zakładki przekrój krystalicznie raportu, ale stara się zrobić coś tylko przy użyciu sql-server

+0

Zmiana sposobu wyświetlania danych jest zwykle zarządzane w warstwie prezentacji, a nie w SQL, np matryca SSRS z łatwością poradzi sobie z danymi w formacie, który już posiadasz i wyświetla je w wymaganym formacie. Gdzie chcesz wyświetlić wyniki? – GarethD

+0

@GarethD: Wprowadzanie tego do programu Excel będzie wykonywać –

Odpowiedz

3

Można PIVOT, następnie UNPIVOT dane z pierwotnym zapytaniu dostać go w żądanym formacie:

WITH T AS 
( SELECT c.ContactID, 
      ContactName = c.Name, 
      Year = DATEPART(YEAR, i.InvDate), 
      Invoices = CAST(COUNT(i.InvoiceID) AS FLOAT), 
      InvTotal = CAST(SUM(i.InvTotal) AS FLOAT) 
    FROM Invoice AS i 
      INNER JOIN dbo.Contact AS c 
       ON c.ContactID = i.InvContactID 
    GROUP BY c.ContactID, c.Name, DATEPART(YEAR, i.InvDate) 
    HAVING SUM(i.InvTotal) > 2000 
) 
SELECT ContactName = CASE WHEN pvt.Measure = 'InvTotal' THEN '' ELSE pvt.ContactName END, 
     pvt.Measure, 
     [2012] = ISNULL(pvt.[2012], 0), 
     [2013] = ISNULL(pvt.[2013], 0), 
     [2014] = ISNULL(pvt.[2014], 0) 
FROM T 
     UNPIVOT 
     ( Value 
      FOR Measure IN ([Invoices], [InvTotal]) 
     ) AS upvt 
     PIVOT 
     ( SUM(Value) 
      FOR [Year] IN ([2012], [2013], [2014]) 
     ) AS pvt 
ORDER BY pvt.ContactName, Measure; 

Example on SQL Fiddle

+0

To świetnie! Dzięki –

+0

idealne !!!!!!! –

Powiązane problemy