【问题标题】:Sub select SQL query using where and groupby使用 where 和 groupby 子选择 SQL 查询
【发布时间】:2016-09-06 02:48:31
【问题描述】:

当我在 SQL Server 中尝试以下代码时,

SELECT       
dbo.Category.CatNo as Category, 
dbo.Category.Categaory as Name, 
(select SUM(dbo.SALES.SELLINC) where (dbo.SALES.DATE BETWEEN '2016-07-17' AND '2016-07-23')) AS ActualSales, 
(select SUM(dbo.SALES.SELLINC) where (dbo.SALES.DATE BETWEEN '2015-07-19' AND '2015-07-25')) AS LastYrVariance,
(select SUM(dbo.SALES.SELLINC) where (dbo.SALES.DATE BETWEEN '2016-01-01' AND '2016-09-05')) AS YrToDateActual,
(select SUM(dbo.SALES.SELLINC) where (dbo.SALES.DATE BETWEEN '2015-01-01' AND '2015-09-05')) AS LastYrToDateActual  
FROM dbo.Category INNER JOIN
     dbo.Dissection ON dbo.Category.CatNo = dbo.Dissection.CatNo INNER JOIN
     dbo.Division ON dbo.Dissection.DivNo = dbo.Division.ID INNER JOIN
     dbo.Departments ON dbo.Dissection.DeptNo = dbo.Departments.DeptID INNER JOIN
     dbo.SALES ON dbo.Dissection.DissNo = dbo.SALES.CODE
WHERE (dbo.SALES.BRN = 1) 
GROUP BY dbo.Category.CatNo, dbo.Category.Categaory
ORDER BY dbo.Category.CatNo

我收到以下错误消息,

消息 8120,第 16 级,状态 1,第 2 行 列 'dbo.Category.CatNo' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 中 子句。

有什么帮助吗?

【问题讨论】:

  • 按“执行”时可能忘记选择(突出显示)最后两行?
  • CategaoryGROUP BY 子句中的拼写错误。这不应该是那个特定错误的原因,但仍然......
  • @PhillipXT - 即使在选择列表中,它的拼写也是相同的..dbo.Category.Categaory as Name..
  • 是啊,一大早……我看错地方了……
  • 子查询有一个 select 子句,带有一个 Sum() 函数,该函数尝试对子查询中未提及的表列中的值求和。 (子查询没有 FROM 子句)。这些子查询不应该是子查询,它们只需要是 Sum() 表达式

标签: sql sql-server tsql


【解决方案1】:

子查询有一个 select 子句,其中有一个 Sum() 函数,该函数尝试对子查询中未提及的表的列中的值求和。 (子查询没有 FROM 子句)。这些子查询不应该是子查询,它们只需要是 Sum() 表达式。 你应该检查使用别名来简化你的 SQL 脚本。

SELECT c.CatNo Category, c.Categaory Name, 
     sum(case when s.Date between '2016-07-17' and '2016-07-23' 
           then s.SELLINC else 0 end) ActualSales,
     sum(case when s.Date between '2015-07-25' and '2015-07-19'
           then s.SELLINC else 0 end) LastYrVariance,
     sum(case when s.Date between '2016-01-01' and '2016-09-05' 
           then s.SELLINC else 0 end) YrToDateActual,
     sum(case when s.Date between '2015-01-01' AND '2015-09-05'
           then s.SELLINC else 0 end) LastYrToDateActual 
FROM dbo.Category c
      join dbo.Dissection d on d.CatNo = c.CatNo 
      join dbo.Division v on v.Id = d.DivNo 
      join dbo.Departments p on p.DeptID = d.DeptNo 
      join dbo.SALES s on s.code = d.DissNo 
WHERE s.BRN = 1 
GROUP BY c.CatNo, c.Categaory
ORDER BY c.CatNo

要根据评论中的要求动态生成日期范围,请使用 datediff 和 dateAdd 函数:我不确定您所说的 上一周(2016 年 31 周)去年相同是什么意思周(2015 年 31 周),所以如果这不正确,您可以修改更正。

SELECT c.CatNo Category, c.Categaory Name, 
     sum(case when s.Date between 
           dateAdd(week, datediff(week, 0, getdate())-52, 0) 
       and dateAdd(week, datediff(week, 0, getdate()), 0) 
           then s.SELLINC else 0 end) ActualSales,
     sum(case when s.Date between '2015-07-25' and '2015-07-19'
           then s.SELLINC else 0 end) LastYrVariance,
     sum(case when s.Date between '2016-01-01' and '2016-09-05' 
           then s.SELLINC else 0 end) YrToDateActual,
     sum(case when s.Date between '2015-01-01' AND '2015-09-05'
           then s.SELLINC else 0 end) LastYrToDateActual 
FROM dbo.Category c
      join dbo.Dissection d on d.CatNo = c.CatNo 
      join dbo.Division v on v.Id = d.DivNo 
      join dbo.Departments p on p.DeptID = d.DeptNo 
      join dbo.SALES s on s.code = d.DissNo 
WHERE s.BRN = 1 
GROUP BY c.CatNo, c.Categaory
ORDER BY c.CatNo

【讨论】:

  • 对于下面的查询Sum(CASE WHEN dbo.sales.date BETWEEN '2016-07-17' AND '2016-07-23' THEN dbo.sales.sellinc END) AS ActualSales 而不是硬编码日期。我想从机器中选择当前日期并比较Sum(CASE WHEN dbo.sales.date BETWEEN '**previous week (31 week 2016)**' AND '**Last year same week (31 week 2015)**' THEN dbo.sales.sellinc END) AS ActualSales 星期从星期日开始到星期六结束。有什么帮助吗?
【解决方案2】:

我找不到在您的查询中生成该错误的原因。您可以通过使用CASE 语句来简单地使用那些sub-queries

SELECT dbo.category.catno     AS Category, 
       dbo.category.categaory AS NAME, 
       Sum(CASE WHEN dbo.sales.date BETWEEN '2016-07-17' AND '2016-07-23' THEN dbo.sales.sellinc END) AS ActualSales, 
       Sum(CASE WHEN dbo.sales.date BETWEEN '2015-07-19' AND '2015-07-25' THEN dbo.sales.sellinc END) AS LastYrVariance, 
       Sum(CASE WHEN dbo.sales.date BETWEEN '2016-01-01' AND '2016-09-05' THEN dbo.sales.sellinc END) AS YrToDateActual, 
       Sum(CASE WHEN dbo.sales.date BETWEEN '2015-01-01' AND '2015-09-05' THEN dbo.sales.sellinc END) AS LastYrToDateActual 
FROM   dbo.category 
       INNER JOIN dbo.dissection 
               ON dbo.category.catno = dbo.dissection.catno 
       INNER JOIN dbo.division 
               ON dbo.dissection.divno = dbo.division.id 
       INNER JOIN dbo.departments 
               ON dbo.dissection.deptno = dbo.departments.deptid 
       INNER JOIN dbo.sales 
               ON dbo.dissection.dissno = dbo.sales.code 
WHERE  ( dbo.sales.brn = 1 ) 
GROUP  BY dbo.category.catno, 
          dbo.category.categaory 
ORDER  BY dbo.category.catno 

【讨论】:

  • 感谢它的工作。你能帮我解决另一个问题吗?对于以下查询 ------Sum(CASE WHEN dbo.sales.date BETWEEN '2016-07-17' AND '2016-07-23' THEN dbo.sales.sellinc END) AS ActualSales----硬编码日期。我想从机器中选择当前日期并进行比较----Sum(CASE WHEN dbo.sales.date BETWEEN 'previous week (31 week 2016)' AND 'Last year same week (31 week 2015)' THEN dbo.sales .sellinc END) AS ActualSales----
【解决方案3】:

你能试试下面的查询吗?

 SELECT   Category.CatNo as Category, Category.Categaory as Name, 
(select SUM(SALES.SELLINC) where (SALES.DATE BETWEEN '2016-07-17' AND '2016-07-23')) AS ActualSales, 
(select SUM(SALES.SELLINC) where (SALES.DATE BETWEEN '2015-07-19' AND '2015-07-25')) AS LastYrVariance,
(select SUM(SALES.SELLINC) where (SALES.DATE BETWEEN '2016-01-01' AND '2016-09-05')) AS YrToDateActual,
(select SUM(SALES.SELLINC) where (SALES.DATE BETWEEN '2015-01-01' AND '2015-09-05')) AS LastYrToDateActual  
FROM            dbo.Category INNER JOIN
                         dbo.Dissection ON Category.CatNo = Dissection.CatNo INNER JOIN
                         dbo.Division ON Dissection.DivNo = Division.ID INNER JOIN
                         dbo.Departments ON Dissection.DeptNo = Departments.DeptID INNER JOIN
                         dbo.SALES ON Dissection.DissNo = SALES.CODE
WHERE        (SALES.BRN = 1) 

GROUP BY Category.CatNo, Category.Categaory
ORDER BY Category.CatNo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多