2017-08-01 30 views
2

我正在使用SQL Server從一個動態exec獲取多個結果作爲單個輸出中的一個表的列,現在exec讓我有多個輸出作爲不同的時間表。加入多個「exec」作爲一個輸出SQL服務器

有沒有辦法將它們合併在一起並獲得單個輸出?

這是我的代碼:

Declare @status nvarchar(255) 
Declare POINTER cursor global for select distinct status from intermedio 
open POINTER 
fetch NEXT from POINTER into @status 
while (@@FETCH_STATUS=0) 
begin 
exec('select distinct(
Select COUNT(*) from (
SELECT DISTINCT PKN 
FROM INTERMEDIO 
WHERE PIECE IN ('+'''+891''','''+75'''+') and ESTATUS = '''[email protected]+''' 
group by PKN 
having count(*)=2 
) ser) as '[email protected]); 
fetch next from POINTER into @status 
end; 
close POINTER; 
DEALLOCATE POINTER; 

編輯:試圖更好地解釋自己,再次請原諒我的英語很差。 我的表有三列

+-----------+-------+---------+ 
| PKN | PIECE | ESTATUS | 
+-----------+-------+---------+ 
| Set_one | +891 | A1  | 
| Set_one | +75 | A1  | 
| Set_one | +45 | A1  | 
| Set_two | +891 | A3  | 
| Set_two | +75 | A3  | 
| Set_three | +700 | B1  | 
+-----------+-------+---------+ 

我試圖讓兼得(891,+75)的PKNs的計數和計數存在多少ESTATUS

我輸出期待是這樣的:

+----+----+----+ 
| A1 | A3 | B1 | 
+----+----+----+ 
| 1 | 1 | 0 | 
+----+----+----+ 

但它給了我不同表上的行。

我這樣做的原因是因爲表格可能隨時有許多不同的ESTATUS,並且在不同的PKN上有許多不同的部分,結果會不斷變化,每次執行時生成的表格都會有所不同查詢。 如果問題不清楚,我很抱歉,因爲英語不是我的第一語言。

+1

你好,你應該添加表結構,數據樣本和預期的結果。 – Horaciux

+3

我幾乎100%確定光標在不必要的。你所做的基本上是使用循環多次獲取值,現在你想將它們合併回一張表中。當然你可以使用'INSERT INTO EXEC ...',但是你可以使用簡單的'INSERT INTO SELECT'。 – lad2025

+1

我編輯了這個問題來添加表結構和預期的結果,謝謝Horaciux – Richard

回答

1

您正在尋找動態數據透視表和條件聚合。這是一個例子。

create table #tempTable (PKN varchar(64), PIECE varchar(64), ESTATUS varchar(2)) 

insert into #tempTable 
values 
('Set_one','+891','A1'),  
('Set_one','+75','A1'),  
('Set_one','+45','A1'),  
('Set_two','+891','A3'),  
('Set_two','+75','A3'),  
('Set_three','+700','B1')  

select 
    ESTATUS 
    --here is the conditional aggregation 
    ,floor(count(case when PIECE = '+891' or PIECE = '+75' then PKN end)/2) as CT 
into #staging 
from 
    #tempTable 
group by ESTATUS 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(ESTATUS) 
FROM (SELECT DISTINCT ESTATUS FROM #staging) AS ESTATUS 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT ' + @ColumnName + ' 
    FROM #staging 
    PIVOT(Sum(CT) 
      FOR ESTATUS IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

drop table #tempTable 
drop table #staging 

退貨

+----+----+----+ 
| A1 | A3 | B1 | 
+----+----+----+ 
| 1 | 1 | 0 | 
+----+----+----+ 
+1

這讓我更接近於以前的答案,我設法使用類似於您的代碼的方式來做到這一點,不同之處在於我需要檢查PKN是否在桌面上重複使用,如果它與只有一個或另一個,它不算。總之你幫了我很多,謝謝。 – Richard

+0

很高興幫助@Richard – scsimon