Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2014-不同的表交互和求和_Sql_Sql Server_Database_Sum - Fatal编程技术网

SQL Server 2014-不同的表交互和求和

SQL Server 2014-不同的表交互和求和,sql,sql-server,database,sum,Sql,Sql Server,Database,Sum,简而言之,我有一个数据库,我只需要选择2008年利润最高的前10名最佳产品。(我有一个样本数据库) 我有一个大问题 以下是不完整但有效的代码: SELECT [AdventureWorksDW2012].[dbo].[FactInternetSales].ProductKey, SUM([AdventureWorksDW2012].[dbo].[FactInternetSales].OrderQuantity) OrderQuantitySum FROM [Ad

简而言之,我有一个数据库,我只需要选择2008年利润最高的前10名最佳产品。(我有一个样本数据库)

我有一个大问题

以下是不完整但有效的代码:

SELECT 
    [AdventureWorksDW2012].[dbo].[FactInternetSales].ProductKey,    
    SUM([AdventureWorksDW2012].[dbo].[FactInternetSales].OrderQuantity) OrderQuantitySum
FROM
    [AdventureWorksDW2012].[dbo].[FactInternetSales]
GROUP BY 
    ProductKey
ORDER BY 
    OrderQuantitySum DESC;
以下是输出:

在db中,我有订单和产品,因此基本上可以有ID为15的产品,例如,它可以有很多订单,比如200-300。 我总结了所有的订单,并将相同的ID分组

现在我需要限制2008年发生的所有订单,我加上另一个表,下面是代码:

SELECT 
    [AdventureWorksDW2012].[dbo].[FactInternetSales].ProductKey,    
    SUM([AdventureWorksDW2012].[dbo].[FactInternetSales].OrderQuantity) OrderQuantitySum,
    [AdventureWorksDW2012].[dbo].[DimDate].CalendarYear
FROM
    [AdventureWorksDW2012].[dbo].[FactInternetSales], [AdventureWorksDW2012].[dbo].[DimDate]
WHERE 
    CalendarYear = 2008
GROUP BY 
    ProductKey, CalendarYear
ORDER BY 
    OrderQuantitySum DESC;
以下是输出:

所以我的订单数量变得异常巨大,我不明白为什么

我只需要使用2008年的订单,而不是减少订单数量,而是难以置信地增加


有什么建议吗

您所做的是笛卡尔连接,它将返回
FactInternetSales
DimDate
表中每一行的所有可能组合。您需要使用如下所示的内部联接,并且可以在联接中使用
CalendarYear
过滤器,而不是添加WHERE子句。作为内部联接,这仍然会限制2008日历年
FactInternetSales
中的行,因为只有此表中与
DimDate
匹配的行才会包含在结果集中。我没有使用这些表,但我猜它们共享一个DateKey列或类似列(即,
DimDate
中唯一的列,并且与
FactInternetSales
中的列相关)。全名也使用表别名,以提高可读性。ORDER BY中不需要表别名,因为此列在SELECT中具有别名,而ORDER BY在SELECT之后进行求值,因此,
OrderQuantitySum
名称在此处有效。您的SQL可能与此类似

SELECT 
FIS.ProductKey,
SUM(FIS.OrderQuantity) AS OrderQuantitySum,
DD.CalendarYear
FROM [AdventureWorksDW2012].[dbo].[FactInternetSales] FIS
INNER JOIN [AdventureWorksDW2012].[dbo].[DimDate] DD ON FIS.DateKey = DD.DateKey AND DD.CalendarYear = 2008
GROUP BY FIS.ProductKey, DD.CalendarYear
ORDER BY OrderQuantitySum DESC;

您所做的是笛卡尔连接,它将返回
FactInternetSales
DimDate
表中每一行的所有可能组合。您需要使用如下所示的内部联接,并且可以在联接中使用
CalendarYear
过滤器,而不是添加WHERE子句。作为内部联接,这仍然会限制2008日历年
FactInternetSales
中的行,因为只有此表中与
DimDate
匹配的行才会包含在结果集中。我没有使用这些表,但我猜它们共享一个DateKey列或类似列(即,
DimDate
中唯一的列,并且与
FactInternetSales
中的列相关)。全名也使用表别名,以提高可读性。ORDER BY中不需要表别名,因为此列在SELECT中具有别名,而ORDER BY在SELECT之后进行求值,因此,
OrderQuantitySum
名称在此处有效。您的SQL可能与此类似

SELECT 
FIS.ProductKey,
SUM(FIS.OrderQuantity) AS OrderQuantitySum,
DD.CalendarYear
FROM [AdventureWorksDW2012].[dbo].[FactInternetSales] FIS
INNER JOIN [AdventureWorksDW2012].[dbo].[DimDate] DD ON FIS.DateKey = DD.DateKey AND DD.CalendarYear = 2008
GROUP BY FIS.ProductKey, DD.CalendarYear
ORDER BY OrderQuantitySum DESC;

因为您使用的是过时的联接语法。不要使用逗号分隔的表列表。您已经通过这种方式创建了交叉连接。此外,请为表使用别名,不要在查询中使用完全限定名。很难维护,列名的3部分和4部分命名已经被弃用。我很震惊,我仍然像在这个网站上一样经常看到ansi-92之前的连接语法。-在ANSI-92 SQL标准中(超过25年前),旧样式的逗号分隔表列表样式已被正确的ANSI
JOIN
语法所取代,不鼓励使用它,因为您使用的是过时的JOIN语法。不要使用逗号分隔的表列表。您已经通过这种方式创建了交叉连接。此外,请为表使用别名,不要在查询中使用完全限定名。很难维护,列名的3部分和4部分命名已经被弃用。我很震惊,我仍然像在这个网站上一样经常看到ansi-92之前的连接语法。-在ANSI-92 SQL标准中(超过25年前),旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用不受欢迎,但使用有意义的表别名。作为一个示例查询,我不完全确定这是否重要,因为他只是在帮助别名的运算将是有意义的。@EricBrandt说得好,谢谢。我的帖子已更新为更具描述性的别名。你完全正确,DimDate有一个列DateKey,该列对于该表是唯一的,但正是.DateKey给了我这里唯一的错误。FactInternetSales是否有名称中带有日期的列?可能类似fkDateKey?向上投票,但使用有意义的表别名。作为一个示例查询,我不完全确定这是否重要,因为他只是在帮助别名的运算将是有意义的。@EricBrandt说得好,谢谢。我的帖子已更新为更具描述性的别名。你完全正确,DimDate有一个列DateKey,该列对于该表是唯一的,但正是.DateKey给了我这里唯一的错误。FactInternetSales是否有名称中带有日期的列?也许是像DateKey这样的?