我有一些看起来像这样的代码:
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,而是接受传入的任何Item#。我尝试了一些解决方案来通过select语句获取Item#但似乎聚合函数SUM()& COUNT()抱怨,因为我尝试过的解决方案返回列名的varchar,而不是列数据本身。有没有办法在不使用字符串连接的情况下传递Item#列?
谢谢!
答案 0 :(得分:4)
我已经在这个网站上发布了几个月了。我常常选择一些我以前没见过的语法。
非常酷的东西!
我通常将代码放在测试环境中。在这种情况下,我使用了Adventure Works 2012。
工具提示或图片说出千言万语。
您在值列表中有元组。但是,TotalDue不是字符串,它引用外表[Sales]。[SalesOrderHeader]。
用 SELECT 替换内部交叉应用只会带回要应用于每一行的值。对外表的引用丢失了。
鉴于这一事实,您需要动态创建SQL。您可以使用列名作为sysname创建并填充表。然后动态编写代码并使用sp_executesql执行它。
确保这是一个内部的报告查询。 您不想引入SQL注入。
此外,虽然开始和工作,它实际上不是那么快或最好的方法。 日期文字是提高速度和准确性的方法。