使用分组转换/转换的 SQL 查询
Posted
技术标签:
【中文标题】使用分组转换/转换的 SQL 查询【英文标题】:SQL query using cast/convert in group by 【发布时间】:2014-11-26 09:48:25 【问题描述】:我最近正在编写一个查询,我必须将时间戳转换为日期,然后对转换后的日期执行聚合。因此,一种简单的方法是使用 group by 中的转换公式(与创建列时相同),它确实有效。
但是,它似乎并不是最优化的方式。我能感觉到性能在恶化。有没有更好的方法?
查询正在使用视图,其结构如下:
SELECT ORG ,
CONVERT(DATE, CREATION_DATE, 101) ,
SKU_CODE ,
SKU_NAME ,
COUNT(UNIT) AS Production
FROM dbo.abcd_efgh_ijk(123, 'abc', NULL, '10009', NULL,
'2014-11-01 00:00:00', '2014-11-30 23:59:59') SFSTAT
WHERE PASS_DATETIME IS NOT NULL
GROUP BY ORG ,
SKU_CODE ,
CONVERT(DATE, CREATION_DATE, 101) ,
SKU_NAME
HAVING COUNT(UNIT) >= 100;
很高兴在这里学习优化。
【问题讨论】:
看起来您的select columns list
是column names in group by
的较短版本,但应该相同
那是我的错,他们是一样的
也许你应该调整你的Table Valued Function
表函数是什么样的?我会支持在那儿寻找性能改进的建议
【参考方案1】:
据我所知,这是无法做到的,但您可以通过一个简单的子查询轻松避开该问题:
SELECT ORG ,
CreationDate ,
SKU_CODE ,
SKU_NAME ,
COUNT(UNIT) AS Production
FROM (
SELECT
ORG ,
CONVERT(DATE, CREATION_DATE, 101) AS CreationDate,
SKU_CODE ,
SKU_NAME ,
UNIT,
PASS_DATETIME,
FROM
dbo.abcd_efgh_ijk(123, 'abc', NULL, '10009', NULL,
'2014-11-01 00:00:00', '2014-11-30 23:59:59')
) SNMFT
WHERE PASS_DATETIME IS NOT NULL
GROUP BY ORG ,
SKU_CODE ,
CreationDate,
SKU_NAME
HAVING COUNT(UNIT) >= 100;
【讨论】:
以上是关于使用分组转换/转换的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何将这个简单的 sql 查询转换为学说 querybuilder
如何使用 LEFT JOIN 查询将 RAW SQL 转换为 DQL