总结查询的结果

时间:2012-03-15 08:12:45

标签: sql database sql-server-2008

好的,所以我知道这个查询应该给出什么,它应该给出它输出的总和的总和。我无法弄清楚如何总结结果。我使用的数据库是发布者数据库

这是我的查询

SELECT DISTINCT authors.state, qty*price as total
from authors
JOIN titleauthor on titleauthor.au_id = authors.au_id
JOIN titles on titles.title_id = titleauthor.title_id
JOIN sales on sales.title_id = titles.title_id
JOIN stores on stores.stor_id = sales.stor_id
WHERE authors.state LIKE stores.state

以下是它给出的输出

CA 104.6500
CA 299.8000
CA 299.8500
CA 1000.0000

2 个答案:

答案 0 :(得分:3)

连接为您提供了重复项,因为它们包含多个表示多对多关系的表,并且过滤不足以阻止多对多表根据给定的连接条件返回多行

您可以通过以EXISTS谓词的形式引入半连接并随后在其中移动某些表来避免重复。这是在您的情况下使用EXISTS的一种可能方式:

SELECT
  stores.state,
  SUM(qty * price)
FROM sales
INNER JOIN stores ON sales.stor_id  = stores.stor_id
INNER JOIN titles ON sales.title_id = stores.title_id
WHERE EXISTS (
  SELECT *
  FROM authors a
  INNER JOIN titelauthor ta ON a.au_id = ta.au_id
  WHERE ta.titel_id = titles.title_id
    AND a.state LIKE stores.state
)
GROUP BY
  stores.state

中心表很可能是sales,这是数字的来源。因此,查询是围绕sales构建的。其他表是显式连接的(使用JOIN子句),只要它们为sales的每一行只返回一行。一旦表格返回多行,它就会移动到EXISTS。

还有一件事。在处理此查询时,我注意到一个连接可能是多余的(在您的查询中以及在我的查询中)。该表格为titles。如果您的外键有序,则无需加入titles,因为titleauthor可以直接加入stores上的title_id。 (即使您没有相应的外键,您仍然不必包含titles,因为titleauthorsales引用的任何可能不存在的标题都是过滤掉了。)

因此最终查询可能如下所示:

SELECT
  stores.state,
  SUM(qty * price)
FROM sales
INNER JOIN stores ON sales.stor_id  = stores.stor_id
WHERE EXISTS (
  SELECT *
  FROM authors a
  INNER JOIN titelauthor ta ON a.au_id = ta.au_id
  WHERE ta.titel_id = sales.title_id
    AND a.state LIKE stores.state
)
GROUP BY
  stores.state

答案 1 :(得分:0)

SELECT DISTINCT authors.state, sum(qty*price) as total
from authors
JOIN titleauthor on titleauthor.au_id = authors.au_id
JOIN titles on titles.title_id = titleauthor.title_id
JOIN sales on sales.title_id = titles.title_id
JOIN stores on stores.stor_id = sales.stor_id
WHERE authors.state = stores.state
group by authors.stat