聚合函数帮助 - mssql

时间:2014-04-02 15:14:46

标签: sql-server aggregate

需要一些帮助按月为客户及其代理商渠道获取销售

有一个看起来像这样的客户表

客户表:     cust_id bigint,     agent_id bigint,     name varchar(200),     customer_level int,     date_signed datetime

客户级别= 1可以进行交易的客户; agent_id = null customer_level = 2是level_1客户的代理并且可以进行交易,level_1 cust_id = level_2 agent_id

交易表:     tx_id bigint,     tx_date日期时间,     description varchar(200),     金额,     cust_id bigint

SQL

SELECT datepart(month, t.tx_date) AS TX_MONTH
    ,CASE 
        WHEN c.customer_level = 2
            THEN a.NAME
        ELSE c.NAME
        END AS CUSTOMER
    ,count(t.amount)
    ,sum(t.amount)
FROM TRANSACTION t
INNER JOIN customer c ON t.cust_id = c.cust_id
LEFT JOIN customer a ON c.agent_id = a.cust_id
WHERE t.tx_date >= '2014-01-01 00:00:00.000'
GROUP BY datepart(month, t.tx_date)
ORDER BY 1 ASC

===

对于初学者来说这个sql不会工作需要按c.name,a.name

进行分组

然而,预期的结果将无法实现....这是通过客户及其代理渠道获得月度销售

HELP!

1 个答案:

答案 0 :(得分:0)

我做的假设:

  1. 如果在新年边界使用此报告,您可能希望将年份作为结果集的一部分。

  2. 您可能希望将参数传递给此查询,我将使用@CustID BIGINT和@StartDate DATE,@ EndDate DATE来帮助限制行,以便在大型结果集的情况下出于性能原因

  3. 您需要按照select子句中使用的表达式进行分组。

  4. 试试这个:

    
        SELECT MONTH(t.tx_date) AS TX_MONTH, YEAR(t.tx_date) AS TX_YEAR
            ,CASE 
                WHEN c.customer_level = 2
                    THEN a.NAME
                ELSE c.NAME
            END AS CUSTOMER
            ,count(t.amount)
            ,sum(t.amount)
        FROM TRANSACTION t
            INNER JOIN customer c ON t.cust_id = c.cust_id
            LEFT JOIN customer a ON c.agent_id = a.cust_id
        WHERE CAST(t.tx_date AS DATE) BETWEEN @StartDate AND @EndDate
            AND c.cust_id = @CustID
        GROUP BY YEAR(t.tx_date), MONTH(t.tx_date)
            ,CASE 
                WHEN c.customer_level = 2
                    THEN a.NAME
                ELSE c.NAME
            END
        ORDER BY YEAR(t.tx_date), MONTH(t.tx_date)
    
    

    对于两个日期之间的给定客户,这应该为您提供一个结果集,其中包含代理商名称或客户名称的年份,交易月份。

相关问题