2017-01-02 131 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

非常感谢,但我应该把总进入和总的完全退出..我怎样才能把他们分开? –