SQL Where子句中的动态列名称

时间:2016-05-19 06:47:26

标签: sql automation

我有一种情况,我想尝试自动化。请帮忙。如果有类似问题的链接/引用。请分享,我做了一些研究,但找不到我需要的确切内容。 所以我有一个包含大约30列的表,其中第一列包含所有Emp ID的列表,其余29列包含标志“Y”,“N”。列名基本上是EMP符合条件的产品名称。

数据看起来像这样。

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 prods条件的EMP,依此类推。所以我的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表来自动化这个过程,因为目前我必须为所有集群编写多个查询,并且由于每个quater和列表更改都是动态的,因此维护也很痛苦。

我正在寻找一个没有简单的SQL解决方法,因为系统限制没有过程/函数。

注意:我创建了假数据。如果有些事情不清楚/可以理解,请告诉我。

非常感谢所有帮助。

1 个答案:

答案 0 :(得分: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 '+@VAR+ ' = 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相关。这应该工作。如果这有帮助,请告诉我。