Sql 动态交叉应用值

Sql 动态交叉应用值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一些代码如下所示: SELECT colname, SUM(value) AS items_sum, COUNT(value) AS items_count FROM MyTable CROSS APPLY ( VALUES ('Item1',Item1),('Item2',Item2) ) x(colname, value) WHERE Date BETWEEN @sdate AND @edate AND value IS NOT NULL GROUP BY co

我有一些代码如下所示:

SELECT  colname, SUM(value) AS items_sum, COUNT(value) AS items_count
FROM MyTable
CROSS APPLY (
    VALUES ('Item1',Item1),('Item2',Item2)
    ) x(colname, value)
WHERE Date BETWEEN @sdate AND @edate
    AND value IS NOT NULL
GROUP BY colname
我被要求将查询更改为不再是硬代码Item1、Item2,而是接受传入的任何项。我尝试了一些通过select语句获取项的解决方案,但聚合函数SUM&COUNT似乎有问题,因为我尝试的解决方案返回的是列名的varchar,而不是列数据本身。有没有一种方法可以在不使用字符串连接的情况下传递列项


谢谢

我已经在这个网站上发布了几个月了。我并不经常学习一些以前从未见过的语法

真的很酷

我通常将代码放在测试环境中。在本例中,我使用了AdventureWorks2012

工具提示或图片说明了千言万语

值列表中有元组。但是,TotalDue不是字符串,它引用外部表[Sales].[SalesOrderHeader]

用SELECT替换内部交叉应用只会返回要应用于每一行的值。对外部表的引用丢失

鉴于这一事实,您将需要动态创建SQL。您可以使用列名称作为sysname创建并填充一个表。然后动态编写代码并使用sp_executesql执行

确保这是一个内部、报告、查询。您不想引入SQL注入

此外,虽然开始和工作,它确实不是最快或最好的方法。日期文字是追求速度和准确性的途径


谢谢帮助我真正理解了这个问题。结果完全按照你的建议做了。DynSQL的列名。非常感谢。交叉应用和分组是一个非常有趣的用法。我真的很喜欢在交叉应用中指定多个元组值的方式,可能使用不同的列,结果集将包含每个元组值1行聚合数据。非常整洁!选择colname、SUMvalue作为items\u sum、COUNTvalue作为items\u count FROM Sales.SalesOrderHeader交叉应用值'TotalDue',TotalDue,'SubTotal',SubTotal Tcolname,值不为null的值按colname分组