使用cast / convert in group by的SQL查询

时间:2014-11-26 09:48:26

标签: sql sql-server performance sql-server-2008 query-optimization

我最近编写了一个查询,我必须将时间戳转换为日期,然后在转换日期执行聚合。因此,一个微不足道的方法是在分组中使用转换公式(与创建列时相同),它确实有用。

然而,它似乎并不是最优化的方式。我觉得性能会恶化。有没有更好的方法呢?

查询使用了一个视图,其结构如下:

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;

很高兴在这里学习优化。

1 个答案:

答案 0 :(得分:0)

据我所知,这是无法完成的,但是您可以通过一个简单的子查询轻松解决该问题:

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;