有人可以查看我的选择声明并提供一些帮助吗?我有一个具有整数值的字段,我需要将其转换为小数,并取决于该值是否为>是否为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所以任何建议将不胜感激。有什么想法吗?
答案 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
子句,因此我只能部分确定这将按预期工作。要仅按Mnth
和State
分组,您需要在聚合函数内包装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