2017-09-20 98 views
0

我試圖使下面的Pivot SQL查詢動態。SQL:服務器動態PIVOT查詢

應該從下面的查詢中檢索動態客戶的列表。

客戶列表查詢

SELECT 
    Cust_Name 
FROM dbo.Customer 
INNER JOIN dbo.Service 
    ON dbo.Customer.Cust_ID = dbo.Service.Cust_ID 
WHERE [Next_Service] BETWEEN '2017-09-01' AND '2015-09-10' 

樞軸查詢

Select * 
from 
(
    select Customer.Cust_Name,Agreementlist.ProductQty,Store.Product_Name as Refill 
    from dbo.Agreement INNER JOIN dbo.Agreementlist ON dbo.Agreement.Agreement_ID = dbo.Agreementlist.Agreement_ID INNER JOIN dbo.Customer 
    ON dbo.Customer.Cust_ID = dbo.Agreement.Cust_ID INNER JOIN Store on Store.Pro_ID = dbo.Agreementlist.ProID where CatID='2' and Agreement.Status='Approved' 

) x 
pivot 
(
    sum(ProductQty) 
    for Cust_Name in ("list of customers resulted from the first query") 
) p 

回答

0

您可以添加一個光標循環你的習慣並將它們添加到變量中。這裏工作。

declare @gruppe nvarchar(max) 
    declare @gruppeSql nvarchar(max) 
    declare @SQL nvarchar(max) 

    DECLARE myCustomers CURSOR FOR 

    SELECT Cust_Name FROM dbo.Customer INNER JOIN dbo.Service 
    ON dbo.Customer.Cust_ID = dbo.Service.Cust_ID 
    WHERE [Next_Service] BETWEEN '2017-09-01' AND '2015-09-10' 

    set @gruppeSql = '' 

    OPEN myCustomers 
    FETCH NEXT FROM myCustomers INTO @gruppe 
    IF (@@FETCH_STATUS>=0) 
    BEGIN 
    SET @gruppeSql = @gruppeSql +'[' [email protected]+']' 
    FETCH NEXT FROM myCustomers INTO @gruppe 
    END 
    WHILE (@@FETCH_STATUS<>-1) 
    BEGIN 
    IF (@@FETCH_STATUS<>-2) 
    SET @gruppeSql = @gruppeSql + ',[' [email protected]+']' 
    FETCH NEXT FROM myCustomers INTO @gruppe 
    END 
    CLOSE myCustomers 
    DEALLOCATE myCustomers 

    SET @gruppeSql = replace(@gruppesql,'''','') 

    --select @gruppeSql 
    SET @SQL = ' 
    Select * 
    from 
    (
    select Customer.Cust_Name,Agreementlist.ProductQty,Store.Product_Name as 
    Refill 
    from dbo.Agreement INNER JOIN dbo.Agreementlist ON 
    dbo.Agreement.Agreement_ID = dbo.Agreementlist.Agreement_ID INNER JOIN 
    dbo.Customer 
    ON dbo.Customer.Cust_ID = dbo.Agreement.Cust_ID INNER JOIN Store on 
    Store.Pro_ID = dbo.Agreementlist.ProID where CatID=''2'' and 
    Agreement.Status=''Approved'' 

) x 
    pivot 
    (
    sum(ProductQty) 
    for Cust_Name in ('[email protected]+') 
) p' 

    print @sql 
    exec(@sql) 

SQL打印 enter image description here

結果: enter image description here

+0

錯誤:消息207,級別16,狀態1,行14 無效的列名稱GRUPPE「。 – Ayman

+0

抱歉刪除gruppe - 它來自我的舊SQL - 我只是編輯了行。 – plaidDK

+0

剛剛編輯我的SQL,所以如果您的客戶名稱中有空格,請設置括號。然後我將SQL從SQL中移除到循環中。 – plaidDK

0

我已經使用這個SQL腳本來創建動態數據透視

CREATE PROCEDURE [dbo].[dynamicPivot] 
(@tablename  VARCHAR(250), 
@pivotColumn  VARCHAR(250), 
@groupBy   VARCHAR(8000), 
@aggregateColumns VARCHAR(250), 
@aggregation  VARCHAR(250), 
@execute   INT   = 0 
) 
AS 
    BEGIN 
     DECLARE @sql VARCHAR(8000), @pivotcols VARCHAR(8000)= ''; 
     DECLARE @result TABLE(result VARCHAR(8000)); 
     SET @sql = ' 
declare 
    @pivotcols varchar(8000) = ''''; 
with cte as (
select distinct '[email protected]+', ''[''+cast('[email protected]+' as varchar(250))+'']'' col 
from '[email protected]+') 
select @pivotcols = @pivotcols + col + '','' 
from cte 
order by '[email protected]+'; 
set @pivotcols = left(@pivotcols, len(@pivotcols)-1); 
select @pivotcols result'; 
     INSERT INTO @result 
     EXEC (@sql); 
     SELECT @pivotcols = result 
     FROM @result; 
     SET @sql = ' 
SELECT * 
FROM (
    SELECT 
     '[email protected]+CASE @groupBy 
         WHEN '' 
         THEN '' 
         ELSE ', ' 
        [email protected]+', '[email protected]+' 
    FROM '[email protected]+' 
) AS s 
PIVOT 
(
    '[email protected]+' 
    FOR '[email protected]+' IN ('[email protected]+') 
)AS p;'; 
     IF @execute = 0 
      PRINT(@sql); 
      ELSE 
     EXEC (@sql); 
    END; 
GO