MSSQL“分组依据”结果表设计

时间:2018-07-04 08:30:24

标签: sql sql-server

如何将结果1转换为结果2。我无法使用数据透视表获取result2。

结果1

enter image description here

结果1查询

SELECT Country,City,Count(*) as "Count"
FROM Customers
GROUP BY Country,City

结果2

enter image description here

2 个答案:

答案 0 :(得分:1)

除了PIVOT以外,没有SQL的其他功能,如您所发现的,您需要预先知道这些值。

此格式通常在系统的输出部分(例如报表引擎)中完成。例如,SSRS可以很好地处理此问题,并且开箱即用。

您需要动态SQL才能在堆栈中实现这一目标。

答案 1 :(得分:0)

尝试使用此动态sql

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp
CREATE TABLE #Temp([Country] VARCHAR(20),[City] VARCHAR(20),[Count] INT)
INSERT INTO #Temp
SELECT 'Germany'    ,'Aachen'    ,1  UNION ALL
SELECT 'USA'        ,'Albuquerque',1 UNION ALL
SELECT 'USA'        ,'Anchorage'     ,1  UNION ALL
SELECT 'Denmark'    ,'Arhus'         ,1  UNION ALL
SELECT 'Spain'      ,'Barcelone'  ,1

DECLARE @Colmn nvarchar(max),
        @Sql nvarchar(max)

SELECT @Colmn=STUFF((SELECT distinct ', '+QUOTENAME([Country]) FROM #Temp
                FOR XML PATH ('')),1,1,'') 

SET @Sql =' SELECT Cityynames ,'+ @Colmn +' FROM
(
SELECT  *,Country AS Countrynames,City AS Cityynames
FROM #Temp
)dt
PIVOT 
(
MAX([Count]) FOR [Country] IN ('+@Colmn+')
) AS Pvt'
PRINT @Sql
EXEC (@Sql)