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

Posted

技术标签:

【中文标题】动态透视查询查看/存储过程?【英文标题】:Dynamic Pivot query to View/Stored Procedure? 【发布时间】:2016-09-29 07:35:09 【问题描述】:

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

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

这是我的 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)

这是我的结果的样子:

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

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

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

谢谢

【问题讨论】:

【参考方案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 '

【讨论】:

以上是关于动态透视查询查看/存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer(子查询,存储过程,透视,索引)

使用存储过程的结果加入表

将 sql 数据从数据透视表存储过程导出到 excel

在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果

存储过程中的mysql动态查询

如何对视图使用存储过程进行动态查询?