【问题标题】:Need SUM, AVG, COUNT of results GROUPED BY month and year only只需要按月和年分组的结果的总和、平均数、计数
【发布时间】:2018-06-08 07:11:47
【问题描述】:

我试图通过下面提到的查询从销售数据中获取每年每个月的销售美元总和、销售数量、平均销售价格、市场天数中位数和销售价格中位数:

SELECT CAST(MNTH AS VARCHAR(2)) +'-'+ CAST(YR AS VARCHAR(4)) AS 'MONTH-YEAR', YR, MNTH, 
    MAX(dol_vol) AS 'Dol. Vol.',
    MAX(no_sales) AS '# of Sales',
    MAX(avg_price) AS 'Average Price',
    MAX(med_price) AS 'Median Price',
    MAX(med_days) AS 'Median Days'
FROM (SELECT YEAR(dt) YR, MONTH(dt) MNTH,
    SUM(sale_price) dol_vol,
    COUNT(sale_price) no_sales,
    AVG(sale_price) avg_price,
    PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY sale_price) OVER (PARTITION BY year(dt), month(dt)) med_price,
    PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY days_mkt) OVER (PARTITION BY year(dt), month(dt)) med_days
  FROM Sales_Data
  WHERE status='sld' AND year(dt)>='2000' AND sale_price>1000) d
GROUP BY YR, MNTH
ORDER BY YR, MNTH;

但是,我收到以下错误:

Msg 8120, Level 16, State 1, Line 7
Column 'Sales_Data.dt' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

现在,如果我尝试在子查询中为“dt”列添加 GROUP BY 条件,那么对于 sale_price 和 days_mkt 列也会出现相同的错误。我如何获得资源

【问题讨论】:

    标签: sql-server tsql window-functions


    【解决方案1】:

    试试这个:

        SELECT CAST(MNTH AS VARCHAR(2)) +'-'+ CAST(YR AS VARCHAR(4)) AS 'MONTH-YEAR', YR, MNTH, 
        MAX(dol_vol) AS 'Dol. Vol.',
        MAX(no_sales) AS '# of Sales',
        MAX(avg_price) AS 'Average Price',
        MAX(med_price) AS 'Median Price',
        MAX(med_days) AS 'Median Days'
    FROM 
    (
        SELECT YEAR(dt) YR, MONTH(dt) MNTH,
        NULL dol_vol,
        NULL no_sales,
        NULL avg_price,
        PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY sale_price) OVER (PARTITION BY year(dt), month(dt)) med_price,
        PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY days_mkt) OVER (PARTITION BY year(dt), month(dt)) med_days
        FROM Sales_Data
        WHERE status='sld' AND year(dt)>='2000' AND sale_price>1000
    
        UNION ALL
    
        SELECT YEAR(dt) YR, MONTH(dt) MNTH,
        SUM(sale_price) dol_vol,
        COUNT(sale_price) no_sales,
        AVG(sale_price) avg_price,
        NULL,
        NULL
        FROM Sales_Data
        WHERE status='sld' AND year(dt)>='2000' AND sale_price>1000
        GROUP BY  YEAR(dt)
                 ,MONTH(dt) 
    
    ) d
    GROUP BY YR, MNTH
    ORDER BY YR, MNTH;
    

    在内部查询中,我们需要准确地告诉引擎根据哪些列/值进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多