2013-10-16 89 views
0

我在訪問以下交叉表查詢:轉換Access交叉表查詢到T-SQL(SQL Server)的

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進行數據透視轉換以解決此問題, 或者我們是否有與此等效的SQL Server查詢?

+0

這是在Access參數查詢?換句話說,當你在Access中運行查詢時,它會提示用戶輸入任何值(比如[開始日期],也許)? –

+0

根據我的知識,在查詢中沒有指定任何參數,主要目標是將此腳本轉換爲T-Sql,但我無法理解該邏輯 – user2701912

+1

在數據庫中顯示數據的示例非常容易表和交叉表數據。但交叉表是壞消息,因爲它們具有動態列,T-SQL或SSIS都不是那樣的。 –

回答

1

我們真的沒有足夠的信息來特定交叉表查詢轉換,所以這裏是一個簡單的例子,可以幫助你實現你的目標:

名爲[汽車]含表...

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 

...訪問交叉表查詢...

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

請添加一些關於動態SQL的問題的評論,以及您提供的代碼首先必須是動態的原因。就個人而言,我更喜歡每次重寫自定義代碼的通用透視存儲過程。你能提供其中之一嗎? – ErikE

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)