【问题标题】:SQL query for displaying 3 fields of data using only one integer data entry仅使用一个整数数据条目显示 3 个数据字段的 SQL 查询
【发布时间】:2013-08-24 05:57:43
【问题描述】:

我有两个独立的 csv 表,其中包含可以通过另一个网页添加的自动数据。这不是静态数据,它是动态的和可变的。

这是我的目标:

  1. 编写一个网页,显示每个产品一年的销售额(数量和价格)表。用户必须能够选择年份。

到目前为止,我的查询已经到此为止了:

SELECT Products.Name, SUM(MonthlySales.SalesVolume) as 'Total Sales'
FROM Products
INNER JOIN MonthlySales 
ON Products.Id=MonthlySales.Id
GROUP BY Products.Name;

最重要的是,我需要能够使用 php(我有能力)传入一个值(年份)以进一步缩小搜索范围。我这样做是否正确?

示例数据:

MonthlySales.csv

Id      ProductCode Month   Year    SalesVolume
23041   121           1     1980    983
23042   121           2     1980    960
23043   121           3     1980    939
23044   121           4     1980    927
23045   121           5     1980    931
23046   121           6     1980    950
23047   121           7     1980    975

Products.csv

Id,Name,Price
121,Jelly beans,6.79
122,Banana milkshake powder,8.31
123,Edam Cheese,18.73
124,Hairnet,8.05
125,Aubergine jam,2.66

到最后我需要显示这样的东西:

您选择的年份:1980

Name                      Price      Volume
Jelly Beans               6.79       11000
Banana milkshake powder   8.31       15000

任何帮助将不胜感激。

【问题讨论】:

  • 您应该使用GROUP BY Products.ID 而不是Products.Name。除此之外它看起来还不错。我认为这可能应该在CodeReview 上。
  • 您好,感谢您的回复,我已经尝试过了,但收到错误消息:Msg 8120, Level 16, State 1, Line 1 Column 'Products.Name' 在选择列表中无效,因为它是不包含在聚合函数或 GROUP BY 子句中。
  • 我的脑袋放屁。对不起。我现在明白了。
  • ON Products.Id=MonthlySales.Id 看起来非常错误。也许应该是ON Products.Id=MonthlySales.ProductCode

标签: sql sum inner-join


【解决方案1】:

只要Name 是独一无二的,你所拥有的就会起作用,但这可能不是最好的方法。这可能更准确,因为您将以 PK Id 而不是 Name 字段为基础。

DECLARE @year char(4) = /*your year - datatype should be same as your year col*/;
DECLARE @month int = /*your month - datatype should be same as your month col*/;

SELECT Products.Name, Products.Price, Sales.totalSales AS 'Total Sales'
FROM Products
INNER JOIN (
            SELECT MonthlySales.ProductCode, 
                   SUM(MonthlySales.SalesVolume) AS 'totalSales'
            FROM MonthlySales 
            WHERE MonthlySales.Year = @year AND MonthlySales.Month = @month 
            GROUP BY MonthlySales.ProductCode
           ) AS Sales ON Sales.Id = Products.ProductCode

【讨论】:

  • 好的,这是否需要我有一个名为“Sales”的新表,以 totalSales 作为列?如果我似乎对正在发生的事情视而不见,我很抱歉。在 SQL 管理工作室(我在将 SQL 查询传授给我的 PHP 之前测试 SQL 查询的地方)中,我不是已经为年份和月份设置了数据类型值吗?
  • @Haxxx 不,它正在为SELECT 查询应用别名。与SUM 上发生的事情几乎相同,但发生在查询/表上。你实际上可以在这里FROM Products p 做同样的事情,而不是使用SELECT Products.Name 你可以使用SELECT p.Name。试试这个查询,让我知道它是如何工作的。我不得不查找 SET 部分,我主要使用 T-SQL 和 MySQL 语法略有不同。
  • 在取出 SET 部分并将 'at'year 更改为 CHAR(4) 并将 'at'month 更改为 int 之后,效果好坏参半。 SET 似乎根本不起作用,返回错误?在查询中将 'at'year 更改为 CHAR(4) 并没有错误。但是不承认将'at'month更改为int?并且它仍然给 Sales.totalSales 和底行 AS 旁边的 Sales 提供错误?
  • @Haxxx 你用的是什么数据库?这很重要。
  • 您应该将DECLARE 设置为年份。例如:DECLARE @year char(4) = '1980' 与月份相同。此外,数据类型char(4)int 应分别与数据库中的年份和月份相同。 (提示:它们可能不是char(4)int,它们可能都是同一个东西)
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多