动态交叉应用值

时间:2013-12-13 22:48:31

标签: 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 colname

我被要求将查询更改为不再是硬代码Item1,Item2,而是接受传入的任何Item#。我尝试了一些解决方案来通过select语句获取Item#但似乎聚合函数SUM()& COUNT()抱怨,因为我尝试过的解决方案返回列名的varchar,而不是列数据本身。有没有办法在不使用字符串连接的情况下传递Item#列?

谢谢!

1 个答案:

答案 0 :(得分:4)

我已经在这个网站上发布了几个月了。我常常选择一些我以前没见过的语法。

非常酷的东西!

我通常将代码放在测试环境中。在这种情况下,我使用了Adventure Works 2012。

enter image description here

工具提示或图片说出千言万语。

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

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

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

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

此外,虽然开始和工作,它实际上不是那么快或最好的方法。 日期文字是提高速度和准确性的方法。