【发布时间】:2017-08-19 14:26:42
【问题描述】:
我有一个包含分组依据的 sql 选择查询。分组方式不起作用。我想统计分组后的所有记录。有没有办法直接从sql中解决这个问题?例如,我想计算 mobtel 和金额的总和。
SELECT
--DISTINCT
B.ABS_CHANNEL_NAME AS AGENCY,
B.ABS_REGION AS REGION,
A.MSISDN AS [Mobtel],
A.Activation_date AS [Activation Date],
LEFT(B.DATE, 8) AS [Top Up Date],
DATEDIFF(d, CONVERT(char(10), A.Activation_date,121), CONVERT(char(10), B.DATE,121)) AS [Days Elapsed],
B.Amount,
C.DSM as [DSM],
C.Channel as [CHANNEL]
FROM [ODS_BI_R].[dbo].[R_Activation] A
JOIN [ODS_Raw].[dbo].[D_TopUpTransaction_Amax] B
ON A.MSISDN = CONCAT('63', B.B_NUM)
JOIN [dbo].[Retailer_Sims] C
on B.A_NUM = C.RETAILERID
WHERE Activation_date LIKE '%201701%'
AND B.AMOUNT <> '0:00'
AND A.SEGMENTATION = 'Prepaid'
AND CONVERT(INT,AMOUNT) >= 20
AND DATEDIFF(d, CONVERT(char(15), A.Activation_date,121), CONVERT(char(15), B.DATE,121)) BETWEEN 0 AND 30
---Group BY AGENCY, DSM, Channel, count(A.MSISDN), sum(B.AMOUNT)
ORDER BY A.Activation_date, A.MSISDN, LEFT(B.DATE, 8);
【问题讨论】:
-
为什么在没有使用聚合函数(例如 MAX、SUM、COUNT)时使用 GROUP BY?一般的 GROUP BY 规则还说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!
-
这看起来是 SQL 而不是 Oracle 的 SQL Server 方言。我正在更改标签。如果此更改不正确,请说出来。
-
你不明白
GROUP BY究竟做了什么。使用GROUP BY AGENCY, DSM, Channel,您会说“给我每个 AGENCY、DSM 和频道的结果行,这可能是您想要的。GROUP BY ..., count(A.MSISDN), sum(B.AMOUNT)但是没有意义,因为计数和总和是 结果。因此,您将它们放在SELECT子句中。此外,您将从SELECT子句中删除一些内容,例如B.Amount,因为每个组可以有很多数量,所以您只能显示一个聚合,例如SUM(B.Amount)。 -
对于此类问题,您应该始终显示一些示例数据和预期结果。
标签: sql sql-server