【问题标题】:How to GROUP BY one column and also summing up the result for this grouped column如何按一列分组并总结此分组列的结果
【发布时间】:2021-08-10 10:48:42
【问题描述】:

我有这样的情况,我有一个表,由于某种原因,一个名为 STORE_NUMBER 的列在实际结果中重复了多次,因此结果按项目级别而不是 store_number 的结果总和。

这是我的代码。有谁知道我如何调整代码(按商店分组),以便我有 1 行用于 STORE_NUMBER 1 和 1 行用于 STORE_NUMBER 2 等,并汇总每个特定商店的所有结果?

SELECT s.DEAGY AS 'AGENCY', l.cmschn AS 'MASTER_CHAIN', s.DECHN AS 'CHAIN', s.DESTR AS 'STORE_NUMBER', s.DEWEDT AS 'WK_ENDING',  

CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE 0 END AS  'OB_UNITS', 

CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE 0 END AS 'RET_UNITS',

CAST (( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE '0' END) AS int) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE '0' END )   AS int) AS 'NET_UNITS',

CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE 0 END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE 0 END )  AS Money) 
* 
CAST (100 AS Money) AS '%RET_UNITS',

CASE
WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0'
END AS OB_BILLING,
CASE
WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM'  THEN (-1 * SM.DEQTY) * sm.DERSP ELSE 0
END AS RET_BILLING,
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0' END) 
     AS MONEY) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN (-1 * sm.DEQTY) * sm.DERSP ELSE '0' END )   AS MONEY) AS 'NET_BILLING',

CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM'  THEN (-1 * SM.DEQTY) * sm.DERSP ELSE 0
END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0' END)  AS Money) 
* 
CAST (100 AS Money) AS '%RET_BILLING',




CASE 
WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE 0
END AS OB_MSRP, 
CASE
WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN ( -1 * sm.DEQTY) * sm.DERPRC ELSE 0
END AS RET_MSRP,
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE '0' END) AS MONEY) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN (-1 * sm.DEQTY) * sm.DERPRC ELSE '0' END )   AS MONEY) AS 'NET_MSRP',





CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN ( -1 * sm.DEQTY) * sm.DERPRC ELSE 0 END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE 0
END )  AS Money) 
* 
CAST (100 AS int) AS '%RET_MSRP'




INTO ##temp6
FROM REPIT.SMPDTA.SMPDTLM s
JOIN REPIT.LEVYDTA.LDSCHNM l
ON s.DEAGY=l.CMAGY AND s.DECHN=l.CMCHN
JOIN LEVYDTA.SMPRTNM sm
ON s.DEAGY=sm.DEAGY AND s.DECHN=sm.DECHN AND s.DESTR=sm.DESTR AND s.DEWEDT=sm.DEWEDT
where s.DEWEDT = 20210807 AND s.DEAGY=10 AND s.DECHN='WM';

【问题讨论】:

  • 这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像。 (而且我太老了,无法阅读那个微小的图像文本......)
  • 轻松为您提供帮助 - 简化! minimal reproducible example
  • 这能回答你的问题吗? SQL group by "column name"
  • @ru4ert 不,它没有帮助。我立即收到错误消息“消息 8120,级别 16,状态 1,第 4 行列 'REPIT.SMPDTA.SMPDTLM.DEAGY' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。”
  • 你能解释一下“结果是按项目级别而不是 store_number 的结果总和”吗? cz我不明白。我只是在你的代码 PRE_DATA 中看到最终的 SUM/AVG 等,如果我得到它的话。我们应该如何分组?你想看什么

标签: sql


【解决方案1】:

我不认为你需要的只是总和,有时我猜应该是平均值。

我看到你的任务是这样的(我只是在记事本++中编写代码,这就是检查错误的原因)

WITH PRE_DATA AS(
SELECT 
s.DEAGY AS 'AGENCY', 
l.cmschn AS 'MASTER_CHAIN',
s.DECHN AS 'CHAIN', 
s.DESTR AS 'STORE_NUMBER', 
s.DEWEDT AS 'WK_ENDING',  
CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE 0 END AS  'OB_UNITS', 
CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE 0 END AS 'RET_UNITS',
CAST (( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE '0' END) AS int) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE '0' END )   AS int) AS 'NET_UNITS',

CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN -1 * sm.DEQTY ELSE 0 END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY ELSE 0 END )  AS Money) 
* 
CAST (100 AS Money) AS '%RET_UNITS',

CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0'END AS OB_BILLING,
CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM'  THEN (-1 * SM.DEQTY) * sm.DERSP ELSE 0 END AS RET_BILLING,
CAST (( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0' END) AS MONEY) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN (-1 * sm.DEQTY) * sm.DERSP ELSE '0' END )AS MONEY) AS 'NET_BILLING',

CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM'  THEN (-1 * SM.DEQTY) * sm.DERSP ELSE 0
END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERSP ELSE '0' END)  AS Money) 
* 
CAST (100 AS Money) AS '%RET_BILLING',

CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE 0 END AS OB_MSRP, 
CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN ( -1 * sm.DEQTY) * sm.DERPRC ELSE 0 END AS RET_MSRP,
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE '0' END) AS MONEY) 
- 
CAST ( ( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN (-1 * sm.DEQTY) * sm.DERPRC ELSE '0' END )   AS MONEY) AS 'NET_MSRP',

CAST (( CASE WHEN sm.DEIO='I' AND sm.DEAGY = 10 AND sm.DECHN = 'WM' THEN ( -1 * sm.DEQTY) * sm.DERPRC ELSE 0 END) AS Money) 
/ 
CAST ( ( CASE WHEN s.DEIO='O' AND s.DEAGY = 10 AND s.DECHN = 'WM' THEN s.DEQTY * s.DERPRC ELSE 0
END )  AS Money) 
* 
CAST (100 AS int) AS '%RET_MSRP'

FROM REPIT.SMPDTA.SMPDTLM s
INNER JOIN REPIT.LEVYDTA.LDSCHNM l ON s.DEAGY=l.CMAGY AND s.DECHN=l.CMCHN
INNER JOIN LEVYDTA.SMPRTNM sm ON s.DEAGY=sm.DEAGY AND s.DECHN=sm.DECHN AND s.DESTR=sm.DESTR AND s.DEWEDT=sm.DEWEDT
WHERE s.DEWEDT = 20210807 AND s.DEAGY=10 AND s.DECHN='WM';
)

SELECT AGENCY, MASTER_CHAIN, CHAIN, STORE_NUMBER, WK_ENDING,
SUM(OB_UNITS) as OB_UNITS,
SUM(RET_UNITS) as RET_UNITS,
SUM(NET_UNITS) as NET_UNITS,
AVG([%RET_UNITS]) as '%RET_UNITS',
SUM(OB_BILLING) as OB_BILLING,
SUM(RET_BILLING) as RET_BILLING,
SUM(NET_BILLING) as NET_BILLING,
AVG([%RET_BILLING]) as '%RET_BILLING',
SUM(OB_MSRP) as OB_MSRP,
SUM(RET_MSRP) as RET_MSRP,
SUM(NET_MSRP) as NET_MSRP,
AVG([%RET_MSRP]) as '%RET_MSRP'
FROM PRE_DATA
GROUP BY AGENCY, MASTER_CHAIN, CHAIN, STORE_NUMBER, WK_ENDING

希望对你有帮助

【讨论】:

  • 语法可能有点不同,但你应该明白我的主要想法或关键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2023-03-04
  • 2022-01-11
相关资源
最近更新 更多