在SQL中按错误分组

时间:2014-02-21 22:16:21

标签: sql

有人可以查看我的选择声明并提供一些帮助吗?我有一个具有整数值的字段,我需要将其转换为小数,并取决于该值是否为>是否为0,然后再做一些数学计算,最终在折扣百分比取消后获得折扣成本。问题是它想要将折扣字段放入我不想要的group by子句中,因为它会将打折的字段与未打折的字段分开。希望这是有道理的。这是声明。

SELECT CASE 
            WHEN ITEMS.DISCOUNT > 0 THEN 
                (
                     SUM(ITEMS.IT_UNLIST * QUANTS) 
                     - SUM(ITEMS.IT_UNLIST * QUANTS) 
                     * CAST((ITEMS.DISCOUNT/100) as DECIMAL(8,2))
                 )
            ELSE 
                SUM(ITEMS.IT_UNLIST * QUANTS) 
        END AS Sales
        , MONTH(ITEMS.IT_SDATE) AS Mnth
        , CUST.STATE

我按照Mnth分组,然后按国家分组,这就是我想要分组的所有内容。我是新手sql所以任何建议将不胜感激。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在标准SQL中,您需要将未分组的分组查询中的所有字段包含在聚合函数中。

因此,假设您的所有字段都已包含并加入:

SELECT 
    CUST.STATE,
    MONTH(Items.IT_SDATE) as Mnth,  
    SUM(
        ITEMS.IT_UNLIST * QUANTS
        - ( CAST((ITEMS.DISCOUNT/100) as DECIMAL(8,2)) * ITEMS.IT_UNLIST * QUANTS)
        )
    ) as Sales
FROM Cust, Items
GROUP BY
    CUST.STATE,
    MONTH(Items.IT_SDATE)

请注意,我删除了多余的CASE语句,并将整个表达式包装在单个SUM()中。您还可以计算所有折扣的SUM()然后减去它,但如果您真的想要,则需要将ITEMS.DISCOUNT包装在其自己的SUM中。

答案 1 :(得分:0)

由于此问题中仅提供SELECT子句,因此我只能部分确定这将按预期工作。要仅按MnthState分组,您需要在聚合函数内包装Sales列的整个select语句(在这种情况下我相信它是SUM):

SELECT SUM(
        CASE 
            WHEN ITEMS.DISCOUNT > 0 THEN 
                (
                     ITEMS.IT_UNLIST * QUANTS
                     - ITEMS.IT_UNLIST * QUANTS
                     * CAST((ITEMS.DISCOUNT/100) as DECIMAL(8,2))
                 )
            ELSE 
                ITEMS.IT_UNLIST * QUANTS
        END
        ) AS Sales
        , MONTH(ITEMS.IT_SDATE) AS Mnth
        , CUST.STATE
FROM ........
GROUP BY MONTH(ITEMS.IT_SDATE), CUST.STATE

请注意,如果ITEMS.DISCOUNT永远不为NULL(没有折扣时为0),则不需要ELSE部分,因此不需要CASE WHEN语句同样由@DougM指出。

答案 2 :(得分:0)

SELECT SUM(ITEMS.IT_UNLIST * QUANTS 
           * (1 - CASE WHEN ITEMS.DISCOUNT > 0
                       THEN CAST(ITEMS.DISCOUNT AS DECIMAL(8,2)) / 100
                       ELSE 0 
                  END)) AS Sales
    , MONTH(ITEMS.IT_SDATE) AS Mnth
    , CUST.STATE
FROM ...
WHERE ...
GROUP BY MONTH(ITEMS.IT_SDATE), CUST.STATE