2016-05-19 68 views
0

我在這裏有一個情況,我試圖自動化。請幫忙。如果有任何鏈接/引用類似的問題。請分享,我做了一些研究,但無法準確找到我需要的東西。 所以我有一個約30列的列表,其中第一列包含所有僱員ID列表,其餘29列包含標誌「Y」,「N」。列名基本上是EMP符合條件的產品名稱。SQL中的動態列名Where Where子句

數據看起來像這樣。

Table name: EMPPRODMAP     
EMPCODE PROD1 PROD2 PROD3 PROD4 PROD5 
703 Y N N Y N 
238 N Y N Y N 
806 Y Y Y N Y 
812 N Y Y N Y 
671 Y N Y N N 

現在,有業務部門的集羣。像下面那樣

TABLENAME: CLUSTERMAP 
CLUSTER PRODS 
CL1 PROD1 
CL1 PROD2 
CL2 PROD3 
CL2 PROD4 
CL3 PROD1 
CL3 PROD4 
CL3 PROD2 
CL3 PROD5 

所以我需要做的是列出所有符合CL1刺激條件的EMPs等等。所以,我的SQL目前看起來像

Sel EMPCODE,'CL1' as Cluster,'PROD1' as PRODUCT from EMPPRODMAP where PROD1 = 'Y' 
Union 
Sel EMPCODE,'CL1' as Cluster,'PROD2' as PRODUCT from EMPPRODMAP where PROD2 = 'Y' 

我正在尋找一種方式,我可以利用該表的ClusterMap到automatee這個過程中,因爲目前我有寫的所有集羣和修的多個查詢也因爲疼痛clustermap對每個季度都是動態的,並且列出了變化。

我正在尋找一個沒有普通SQL的解決方法,由於系統限制,沒有過程/功能。

注意:我創建了假數據。請讓我知道,如果有什麼不明確/可以理解的。

所有幫助非常感謝。

+0

您正在使用哪些DBMS? –

回答

1

你可以做這樣的事情。請按照步驟進行。

begin try 

CREATE TABLE #Productnames --Holds list of all products, fetched from column names 
(
Prodname varchar(20) 
) 

CREATE TABLE #TempResultSet --Holds data of EMPPRODMAP in EMPOCODE-Product pair 
(
EMPCODE int 
,ProductName varchar(20) 
) 

--Fetch column names of table EMPPRODMAP except column EMPCODE and insert into the table #Productnames 
INSERT INTO #Productnames 
SELECT column_name FROM information_schema.columns 
WHERE table_name = 'EMPPRODMAP' 
and COLUMN_NAME <> 'EMPCODE' 
ORDER BY ordinal_position 

DECLARE @VAR VARCHAR(20),@EMP INT,@sqlSTMT NVARCHAR(MAX) 

--Iterate on each EMPCODE 
DECLARE empCursor CURSOR 
FOR 
SELECT EMPCODE FROM EMPPRODMAP 

--Iterate on each product name 
DECLARE prodCursor CURSOR 
FOR 
SELECT Prodname FROM #Productnames 

OPEN empCursor 
FETCH NEXT FROM empCursor 
INTO @EMP 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    OPEN prodCursor 

    FETCH NEXT FROM prodCursor 
    INTO @VAR 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    --Inserting data in #TempResultSet in valid EMPCODE-Product pairs 
    SET @sqlSTMT = N'IF EXISTS (SELECT 1 FROM EMPPRODMAP WHERE EMPCODE = @EMP AND '[email protected]+ ' = 1) 
       INSERT INTO #TempResultSet 
       SELECT @EMP ,@VAR' 

    exec sp_executesql @sqlSTMT, N'@EMP INT,@VAR VARCHAR(20)', @EMP,@VAR 

    FETCH NEXT FROM prodCursor 
    INTO @VAR 
    END 
    CLOSE prodCursor 
FETCH NEXT FROM empCursor 
INTO @EMP 
END 
CLOSE empCursor 
DEALLOCATE empCursor 
DEALLOCATE prodCursor 

--Fetching your required result set 
SELECT EPM.EMPCODE,CM.CLUSTER,EPM.ProductName 
FROM 
#TempResultSet EPM 
INNER JOIN 
CLUSTERMAP CM 
ON EPM.ProductName = CM.PRODS 
ORDER BY EPM.EMPCODE 
DROP TABLE #Productnames; 
DROP TABLE #TempResultSet; 
end TRy 
begin catch 
DROP TABLE #Productnames; 
DROP TABLE #TempResultSet; 
throw; 
end catch 

因此,表中的主要挑戰是兩個表之間沒有直接關係。所以,基本上我改變了表EMPPRODMAP的結構,以便它可以與CLUSTERMAP相關。這應該工作。讓我知道這是否有幫助。

+0

這確實幫了我。非常感謝您的迴應和努力。但是,似乎我不得不要求DBA向我提供聲明目前我沒有的程序。這種方法爲我提供了完成任務所需的方向。非常感謝。 :) –

+0

如果您沒有寫入和執行過程的權限,那麼也可以直接運行此查詢,具體取決於您的具體要求。無論如何,你希望。乾杯!! :) –

+0

是的,但上面的查詢將通過自動化的Unix系統運行,該系統從excel文件讀取查詢並在informatica工作流程中運行它們。 (Informatica並行運行多個會話)。我相信我無法在Informatica中運行這樣的SQL。 –