2017-01-02 166 views
0

我無法按我的動態數據透視表中的代碼進行分組。我需要按照如下所示在ZONE表中定義的代碼區進行分組。我需要用group來顯示不同的代碼。有些代碼有多個zone_id,因此我需要合併它們。我使用SQL 2008SQL動態數據透視表按

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

你的問題到底是什麼? – Hogan

+0

如何在我的動態數據透視中按代碼進行分組? –

+0

與'SELECT ... FROM(當前代碼)AS X GROUP BY X.CODE'一樣總是圍繞着你的代碼的相同方式。 – Hogan

回答

1

問題是在你的推導查詢。在你選擇的不是派生表中的所有列。按sql server automaticaly分組(它主要考慮數據透視)。

裏面的支點的選擇是:

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] ... 

和發動機在後臺做到這一點:

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

你必須從內部QRY刪除您的總計。您可以將其移動到外部列選擇中或將其分隔爲qry並創建連接。

您也可以使用動態列的+操作來執行彙總(01_Jan_2017 + 01_Feb_2017 ...)。

EDITED 2017年1月4日 - 試試這個:

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

EDITED 2017年1月5日 - 爲了獲得總計:

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

要獲得最終的輸出加入這個兩個數據集在一起。

+0

你能告訴我我該怎麼做?我試圖分開,但沒有工作 –

+0

這對我來說非常重要,如果你可以編輯我的查詢,我可以把它分爲qry –

+0

非常感謝,但我應該把總進入和總的完全退出..我怎樣才能把他們分開? –