使用分组转换/转换的 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 listcolumn 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

将 SQL 查询转换为 LINQ/点表示法

如何将此查询从SQL(mysql)转换为Eloquent(Laravel)

数据库优化之SQL语句优化-记录

如何在 SQL 中进行转换和分组