我在Access中有以下交叉表查询:
Transform Count(1) as Count
Select Cust,[Cust#],EntryDate,CloseDate
from Tbl1,Dates
where EntryDate>=[start date]
Group by Cust,[Cust#],EntryDate,CloseDate
Order by EntryDate
Pivot Quote;
我很难将其转换为T-SQL。 我是否应该使用SSIS进行Pivot转换以解决此问题, 或者我们是否有相应的SQL Server查询?
答案 0 :(得分:1)
我们实际上没有足够的信息来转换特定的交叉表查询,因此这里有一个简单的例子可以帮助您实现目标:
对于名为[Vehicles]的表格,包含...
VehicleID VehicleMake VehicleModel VehicleType
--------- ----------- ------------ ------------
1 Ford Focus Compact car
2 Ford F-150 Pickup truck
3 Dodge RAM 1500 Pickup truck
4 Toyota Tundra Pickup truck
5 Toyota Prius Hybrid car
6 Toyota Tacoma Pickup truck
... Access交叉表查询...
TRANSFORM Count(Vehicles.VehicleID) AS CountOfVehicleID
SELECT Vehicles.VehicleType
FROM Vehicles
GROUP BY Vehicles.VehicleType
PIVOT Vehicles.VehicleMake;
...返回:
VehicleType Dodge Ford Toyota
------------ ----- ---- ------
Compact car 1
Hybrid car 1
Pickup truck 1 1 2
以下T-SQL脚本完成同样的事情
DECLARE
@ColumnList AS NVARCHAR(MAX),
@SQL AS NVARCHAR(MAX)
-- build the list of column names based on the current contents of the table
-- e.g., '[Dodge],[Ford],[Toyota]'
-- required by PIVOT ... IN below
-- ref: http://stackoverflow.com/a/14797796/2144390
SET @ColumnList =
STUFF(
(
SELECT DISTINCT ',' + QUOTENAME([VehicleMake])
FROM [Vehicles]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),
1,
1,
'')
SET @SQL = '
WITH rollup
AS
(
SELECT VehicleMake, VehicleType, COUNT(VehicleID) AS n FROM [Vehicles]
GROUP BY VehicleMake, VehicleType
)
SELECT * FROM rollup
PIVOT (SUM([n]) FOR [VehicleMake] IN (' + @ColumnList + ')) AS Results'
EXECUTE(@SQL)
它返回:
VehicleType Dodge Ford Toyota
------------ ----- ---- ------
Compact car NULL 1 NULL
Hybrid car NULL NULL 1
Pickup truck 1 1 2
答案 1 :(得分:0)
drop table #tmpT1
select distinct UserField2 into #tmpT1 from CreateExcelForm
--select * from #tmpT1
DECLARE @PivotColumnHeaders VARCHAR(MAX)
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast(UserField2 as varchar) + ']',
'[' + cast(UserField2 as varchar)+ ']'
)
FROM #tmpT1
print(@PivotColumnHeaders)
DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
SELECT *
FROM (
SELECT
* from CreateExcelForm
) AS PivotData
PIVOT (
max(StockCode)
FOR UserField2 IN (
' + @PivotColumnHeaders + '
)
) AS PivotTable
'
EXECUTE(@PivotTableSQL)