SQL动态数据透视表按
我无法按我的动态数据透视表中的代码进行分组。我需要按照如下所示在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
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);
问题是在你的推导查询。在你选择的不是派生表中的所有列。按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
要获得最终的输出加入这个两个数据集在一起。
你能告诉我我该怎么做?我试图分开,但没有工作 –
这对我来说非常重要,如果你可以编辑我的查询,我可以把它分为qry –
非常感谢,但我应该把总进入和总的完全退出..我怎样才能把他们分开? –
你的问题到底是什么? – Hogan
如何在我的动态数据透视中按代码进行分组? –
与'SELECT ... FROM(当前代码)AS X GROUP BY X.CODE'一样总是围绕着你的代码的相同方式。 – Hogan