【问题标题】:Sql with group by and count [duplicate]具有分组依据和计数的Sql [重复]
【发布时间】: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


【解决方案1】:
SELECT
    AGENCY
    , DSM
    , Channel
    , count(A.MSISDN)
    , sum(B.AMOUNT)
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

【讨论】:

  • 收到此错误消息 209,级别 16,状态 1,第 23 行不明确的列名称“通道”。消息 209,级别 16,状态 1,第 8 行不明确的列名称“通道”。
  • @Yinah 哪个表有频道? r_activation、d_topuptransaction_amax、retailer_sims?不管是什么,我们都需要在通道字段前加上别名。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多