动态数据透视查询查看/存储过程?

时间:2016-09-29 07:35:09

标签: sql-server view pivot

经过大量工作后,我设法用我想要的结果创建了一个动态数据透视查询。

现在我需要能够发送参数并过滤我的查询。通常我只是创建一个视图,我可以使用SELECT * FROMWHERE子句使用我的参数进行过滤。我读到从动态数据透视查询创建视图是不可能的,所以我需要帮助才能解决这个问题。

这是我的SQL:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT  ',' + QUOTENAME(p.tag)
                   FROM (((ZUS_Monatsreport_Kopf k
                   LEFT JOIN ZUS_Monatsreport_Pos p ON k.Id = p.Id_Kopf)  
                   LEFT JOIN ADR_Adressen a ON k.Adresse = a.AdressNrADR)  
                   LEFT JOIN ADR_GruppenLink gl ON a.AdressNrADR = gl.AdressNrADR)  
                   LEFT JOIN ADR_Gruppen g ON gl.GruppeADR = g.GruppeADR 
                   GROUP BY p.Tag
                   ORDER BY p.tag
                   FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT AdressNrADR,Monat,Id_kopf,Name,Artikel, '+ @cols + ' FROM
            (
                SELECT a.AdressNrADR,k.monat,p.Id_kopf,a.name + '' ''+ a.vorname as Name,p.Artikel, p.Tag,CASE WHEN CAST(p.wert  AS VARCHAR(10)) = '''' THEN CAST(p.Menge AS VARCHAR(10)) ELSE CAST(p.Wert AS VARCHAR(10)) END AS Menge 
                FROM   ( ( ( ZUS_Monatsreport_Kopf k
                LEFT JOIN  ZUS_Monatsreport_Pos p ON k.Id =  p.Id_Kopf)  
                LEFT JOIN  ADR_Adressen a ON k.Adresse =  a.AdressNrADR)  
                LEFT JOIN  ADR_GruppenLink gl ON a.AdressNrADR =  gl.AdressNrADR)  
                LEFT JOIN  ADR_Gruppen g ON gl.GruppeADR =  g.GruppeADR 
            ) x
             pivot
             ( max(menge)
                for tag in (' +@cols +')
            ) p '

execute(@query)

这就是我的结果:

enter image description here

现在我需要能够围绕这个SQL进行选择并说出例如

SELECT * 
FROM mypivotquery
WHERE AdressNrADR = 10640 (<-parameter) and Monat = 2 (<-parameter)

我希望我能解释一下我在寻找什么,你们可以帮助我:)。

由于

1 个答案:

答案 0 :(得分:1)

您可以在动态查询中添加where条件,将SET @Query语句更改为

SET @query = 'SELECT AdressNrADR,Monat,Id_kopf,Name,Artikel, '+ @cols + ' FROM
        (
            SELECT a.AdressNrADR,k.monat,p.Id_kopf,a.name + '' ''+ a.vorname as Name,p.Artikel, p.Tag,CASE WHEN CAST(p.wert  AS VARCHAR(10)) = '''' THEN CAST(p.Menge AS VARCHAR(10)) ELSE CAST(p.Wert AS VARCHAR(10)) END AS Menge 
            FROM   ( ( ( ZUS_Monatsreport_Kopf k
            LEFT JOIN  ZUS_Monatsreport_Pos p ON k.Id =  p.Id_Kopf)  
            LEFT JOIN  ADR_Adressen a ON k.Adresse =  a.AdressNrADR)  
            LEFT JOIN  ADR_GruppenLink gl ON a.AdressNrADR =  gl.AdressNrADR)  
            LEFT JOIN  ADR_Gruppen g ON gl.GruppeADR =  g.GruppeADR 
            WHERE a.AdressNrADR = 10640 (<-parameter) and Monat = 2 (<-parameter)
        ) x
            pivot
            ( max(menge)
            for tag in (' +@cols +')
        ) p '