动态透视查询查看/存储过程?
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 '
【讨论】:
以上是关于动态透视查询查看/存储过程?的主要内容,如果未能解决你的问题,请参考以下文章