dec*_*led 3 sql t-sql sql-server
我有一些看起来像这样的代码:
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
Run Code Online (Sandbox Code Playgroud)
我被要求将查询更改为不再对 Item1、Item2 进行硬编码,而是接受传入的任何 Item#。我尝试了一些解决方案来通过 select 语句获取 Item#,但似乎聚合函数SUM() & COUNT() 抱怨是因为我尝试过的解决方案返回列名的 varchar,而不是列数据本身。有没有办法在不使用字符串连接的情况下传递列 Item#?
谢谢!
我已经在这个网站上发帖几个月了。我很少会学到一些我以前没见过的语法。
真的很酷的东西!
我通常将代码放在测试环境中。在这种情况下,我使用了 Adventure Works 2012。
工具提示或图片讲述了一千个单词。
您在值列表中有元组。但是,TotalDue 不是字符串,它指的是外部表 [Sales].[SalesOrderHeader]。
用SELECT替换内部交叉应用只会带回应用于每一行的值。对外部表的引用丢失。
鉴于这一事实,您将需要动态创建 SQL。您可以使用列名作为 sysname 创建并填充表。然后动态写代码,用sp_executesql执行。
确保这是一个内部的、报告的、查询。 您不想引入 SQL 注入。
此外,虽然开始并有效,但它确实不是最快或最好的方法。 日期文字是提高速度和准确性的方法。