2017-01-02 5 views
0

Ich bin nicht in der Lage, nach dem Code in meinem dynamischen Pivot zu gruppieren. Ich muss nach dem Code-Bereich gruppieren, der in der ZONE-Tabelle definiert ist, wie unten gezeigt. Ich muss den eindeutigen Code mit der Gruppe nach zeigen. Ein Teil des Codes hat mehr als eine zone_id, daher muss ich sie zusammenführen. Ich bin mit SQL 2008.SQL Dynamic Pivot Group Von

ZONE_ID SITE_ID  ZONE_NAME    CODE 
197  103  ADANA CADDE CAM2 M01001 
180  103  ADANA CADDE CAM1 M01001 

Results

Declare @Date1 date = GetDate() 


IF OBJECT_ID('tempdb..#Dates') IS NOT NULL 
drop table #Dates 


SELECT DISTINCT CONVERT(VARCHAR,START_TIME,106) AS [Date] 
INTO #Dates 
FROM dbo.DIRECTIONAL_METRIC 
WHERE CAST(START_TIME as DATE) >=CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Date1)-1),@Date1),101) 
and CAST(START_TIME as DATE) <= @Date1 
AND DATEPART(HOUR,START_TIME) BETWEEN 9 AND 23 
order by [Date] 

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(convert(varchar,[Date],106)) 
            From #Dates 
            Order by 1 For XML Path('') 
           ),1,1,'') 

Select @SQL = N' 

Declare @Date1 DATE 
SELECT @Date1 = GetDate() 


SELECT [CODE],' + @SQL + ',[Grand Total Enter],[Grand Total Exit] 
FROM 
(
     SELECT [CODE] 
       ,[Date] = CONVERT(VARCHAR, START_TIME, 106) 
       ,[NUM_TO_ENTER] 
       ,[Grand Total Enter] = (SELECT SUM(NUM_TO_ENTER) FROM DIRECTIONAL_METRIC WHERE Zone_ID=A.Zone_ID AND 
          CAST(START_TIME AS DATE) >='''+CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Date1)-1),@Date1),101)+'''AND CAST(START_TIME AS DATE) <='''+cast(@Date1 as varchar(10))+''' 
          AND DATEPART(HOUR,START_TIME)BETWEEN 9 AND 23) 
       ,[Grand Total Exit] =(SELECT SUM(NUM_TO_EXIT) FROM DIRECTIONAL_METRIC Where Zone_ID=A.Zone_ID AND 
          CAST(START_TIME AS DATE) >='''+CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Date1)-1),@Date1),101)+''' AND CAST(START_TIME AS DATE) <='''+cast(@Date1 as varchar(10))+''' 
          AND DATEPART(HOUR,START_TIME)BETWEEN 9 AND 23) 

FROM DIRECTIONAL_METRIC A INNER JOIN ZONE Z ON Z.ZONE_ID = A.ZONE_ID 
     WHERE CAST(START_TIME as DATE) >=CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@Date1)-1),@Date1),101) 
     and CAST(START_TIME as DATE) <= @Date1 
     AND DATEPART(HOUR,START_TIME)BETWEEN 9 AND 23 
     AND Z.CODE IS NOT NULL 
) S 
PIVOT 
(
    SUM([NUM_TO_ENTER]) FOR 
    [Date] IN (' + @SQL + ') 
) AS Pvt GROUP BY [CODE] ' 

Exec(@SQL); 
+3

Was genau ist Ihre Frage? – Hogan

+0

Wie kann ich nach dem CODE in meinem dynamischen Pivot gruppieren? –

+0

gleiche Weise wie immer umgeben den Code, den Sie mit 'SELECT ... FROM (aktuellen Code) AS X GROUP BY X.CODE' – Hogan

Antwort

1

Problem in Ihrer derivatisierte Abfrage wird. In Ihrer Auswahl sind nicht alle Spalten enthalten, die in der abgeleiteten Tabelle enthalten sind. Gruppieren Sie per Do SQL-Server automatisch (es ist wichtig, an Pivot denken).

Innerhalb von Pivot ist wählen:

SELECT 
    [CODE] 
    ,[Date] = CONVERT(VARCHAR, START_TIME, 106) 
    ,[NUM_TO_ENTER] 
    ,[Grand Total Enter] = (select ...) 
    ,[Grand Total Exit] = (select ...) 
FROM ... 
PIVOT (SUM([NUM_TO_ENTER]) FOR [Date] ... 

Und Motor im Hintergrund tun:

SELECT ... 
FROM ... 
GROUP BY CODE, Grand Total Enter, Grand Total Exit 

Sie haben Ihre Endsummen von innen qry zu entfernen. Sie können es in die äußere Spaltenauswahl verschieben oder in qry trennen und Verknüpfungen erstellen.

Sie können Summensummen auch mit + Operation Ihrer dynamischen Spalten machen (01_Jan_2017 + 01_Feb_2017 ...).

EDITED 2017.01.04 - Versuchen Sie folgendes:

SELECT 
    [CODE] 
    ,[Date] = CONVERT(VARCHAR, START_TIME, 106) 
    ,[NUM_TO_ENTER] 
FROM ... 
PIVOT (SUM([NUM_TO_ENTER]) FOR [Date] ... 

2017-01-05 EDITED - Summen zu erhalten:

SELECT 
    [CODE], 
    [Grand Total Enter] = (select ...), 
    [Grand Total Exit] = (select ...) 
FROM (
    SELECT 
     [CODE] 
    FROM ... 
    GROUP BY [CODE] 
) codes 

Um gemeinsam die endgültige Ausgabe verbinden diese beiden Datensätze zu erhalten.

+0

Kannst du mir bitte zeigen, wie ich das machen kann? Ich habe versucht, das zu trennen, aber hat nicht funktioniert –

+0

Das ist wirklich wichtig für mich, ich werde schätzen, wenn Sie meine Abfrage bearbeiten können, wie ich es in Qry trennen kann –

+0

Vielen Dank, aber ich sollte Grand Total eingeben und Grand Total Exit .. Wie kann ich sie getrennt setzen? –