2013-08-03 40 views
0

主題:問題及其任務。 環境:SQL Server 2008或以上 數據庫表:問題,任務和IssuesTaskssql將動態行變爲列

比方說,我有一個單一的輸入屏幕,與一個單一的問題及其相關的任務交易。

我們正在處理Issue1並沒有列出來檢查過7個任務。

用戶檢查的任務7 3爲完成,並保存到數據庫中。

是否可以編寫一個顯示Issue1與同一行上的7個任務的SQL? (請記住只有3個被選中,所以其他的應該是空的)。

還要注意,在IssuesTasks連接表中只有3個任務代表用戶檢查了什麼。

+4

是的,你可以使用[與動態sql的樞軸功能](http://stackoverflow.com/search?tab=newest&q=%5bpivot%5d%5bsql-server%5d%20dynamic)來獲得結果。 – Taryn

回答

0

使用SQL服務器構建在PIVOT功能:

SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    ... 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 

您可以使用PIVOT和UNPIVOT關係運算符來改變一個表值表達式到另一個表。 PIVOT通過將表達式中的一列中的唯一值轉換爲輸出中的多列來旋轉表值表達式,並在最終輸出中需要的任何剩餘列值上執行聚合。通過將表值表達式的列轉換爲列值,UNPIVOT執行與PIVOT相反的操作。

簡單的AdventureWorks例如:

-- Pivot table with one row and five columns 
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
(
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 

更復雜的例子:

USE AdventureWorks2008R2; 
GO 
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5 
FROM 
(SELECT PurchaseOrderID, EmployeeID, VendorID 
FROM Purchasing.PurchaseOrderHeader) p 
PIVOT 
(
COUNT (PurchaseOrderID) 
FOR EmployeeID IN 
([250], [251], [256], [257], [260]) 
) AS pvt 
ORDER BY pvt.VendorID; 

For more information see here

0

雖然你還沒有爲你的表格提供的模式,這是不容易給你寫準確查詢,但看看這個

select 
    I.Id, 
    I.Name, 
    max(case when IT.TaskId = 1 then T.Name end) as Task1, 
    max(case when IT.TaskId = 2 then T.Name end) as Task2, 
    max(case when IT.TaskId = 3 then T.Name end) as Task3, 
    max(case when IT.TaskId = 4 then T.Name end) as Task4, 
    max(case when IT.TaskId = 5 then T.Name end) as Task5, 
    max(case when IT.TaskId = 6 then T.Name end) as Task6, 
    max(case when IT.TaskId = 7 then T.Name end) as Task7 
from Issues as I 
    left outer join IssuesTasks as IT on IT.IssueId = I.Id 
    left outer join Tasks as T on T.Id = IT.TaskID 
group by I.Id, I.Name; 

請參閱SQL FIDDLE示例

0

請原諒,如果這不是猶太教徒;我仍然習慣了這裏的規則(很長一段時間讀者的第一天發佈)。我其實剛剛在我的新博客上寫了一篇文章,我真誠地認爲這會有所幫助。基本上,你可以動態建立迴轉列值,並通過他們向一個動態內置PIVOT查詢是這樣的:

IF (OBJECT_ID('tempdb..#TEMP') is not null) DROP TABLE #TEMP 
DECLARE @cols NVARCHAR(2000) 
SELECT DISTINCT DATE 
INTO #TEMP 
FROM T_EMPLOYEE_PRODUCTIVITY 

SELECT @cols = ISNULL(@cols + ',', '') + '[' + CONVERT(NVARCHAR, DATE) + ']' 
FROM #TEMP 
ORDER BY DATE 
SELECT @cols 
DECLARE @query NVARCHAR(4000) 
SET @query = 'SELECT EMPLOYEE_NAME, ' + @cols + 
'FROM 
(
SELECT EMPLOYEE_NAME, DATE, UNITS 
FROM T_EMPLOYEE_PRODUCTIVITY 
) AS SourceTable 
PIVOT 
(
SUM(UNITS) 
FOR DATE IN ('+ @cols + ') 
) AS PivotTable 
ORDER BY EMPLOYEE_NAME' 
SELECT @query 

EXECUTE(@query) 

如果您需要的樣本數據更詳細的解釋,看看這裏:http://thrillhouseblog.blogspot.com/2013/08/dynamic-pivot-query-in-tsql-microsoft.html

我希望這有助於!