只需要按月和年分组的结果的 SUM、AVG、COUNT

Need SUM, AVG, COUNT of results GROUPED BY month and year only

我正在尝试通过以下查询从销售数据中获取每年每个月的销售美元总和、销售数量、平均销售价格、中位销售天数和中位销售价格:

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 列得到相同的错误。我如何获得 res

试试这个:

    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;

在内部查询中,我们需要准确地告诉引擎 columns/values 分组依据。