2

このMySQLクエリがあります:

select Region,
CONCAT('$', FORMAT(AVG(sales), 0)) as 'Average_Sales_by_Region', 
count(*) as '# of Dist in state'
from dist, Regions_US
where dist.state=Regions_US.State
group by Region ORDER BY AVG(sales) DESC;

上記の MySQL クエリの出力は次のとおりです。

+--------------------+-------------------------------+-------------------------+
| Region             | Average_Sales_by_Region       | # of Dist in state      |
+--------------------+-------------------------------+-------------------------+
| Alaska-Hawaii      | $8,150                        |                       4 |
| Mountain           | $20,216                       |                      74 |
| West North Central | $18,268                       |                      40 |
| South Atlantic     | $16,225                       |                     178 |
| East South Central | $14,967                       |                      30 |
| West South Central | $13,704                       |                     125 |
| East North Central | $12,668                       |                      79 |
| New England        | $11,916                       |                      32 |
| Pacific            | $11,553                       |                     120 |
| Middle Atlantic    | $10,292                       |                     131 |
+--------------------+-------------------------------+-------------------------+

company_name というフィールドがあり、それに対して DISTINCT を実行したい:

select DISTINCT company_name,
Region,CONCAT('$', FORMAT(AVG(sales), 0)) as 'Average_Sales_by_Region', 
count(*) as '# of Dist in state'
from dist, Regions_US
where dist.state=Regions_US.State
group by Region ORDER BY AVG(sales) DESC;

「company_name」のフィールド名で DISTINCT にしたいのですが、company_name フィールドを出力に表示したくありません。DISTINCT company_name を表示せずに行う方法はありますか? その構文は何ですか?また、上記の MySQL クエリのどこに行くのでしょうか? または、これを行う別の方法はありますか?ありがとう!

4

1 に答える 1

2

それを句に追加し、GROUP BY句から削除しSELECTます。

SELECT
  Region,
  CONCAT('$', FORMAT(avgSales, 0)) as 'Average_Sales_by_Region', 
  TheCount as '# of Dist in state'
FROM
(
   SELECT 
     Region, 
     AVG(Sales) avgSales, 
     COUNT(*) theCount
   from dist, Regions_US
   where dist.state=Regions_US.State
   group by Region,company_name
) AS sub       
ORDER BY avgSales DESC;

更新:同じ句で the とsalestheを選択したい場合は、これを行うことはできませんし、行うべきではありません。MySQL ではそうすることができますが、の各グループの任意の値を取得します。AVG(sales)SELECTsalesRegion, company_name

これはa を使用する場合は単一値規則GROUP BYと呼ばれ、これに従うのが標準です。これは、SELECT句内のすべての列が aGROUP BYまたは集約関数のいずれかにある必要があることを意味します。GROUP BY集約関数にも含まれていない行を選択することはできません。あなたの場合sales、集計関数で既に選択していますが、なぜ同じクエリでもAVG選択したいのですか?sales

ただし、とにかくこれを行いたい場合は、次のようにすることができます。

SELECT
  Region,
  CONCAT('$', FORMAT(avgSales, 0)) as 'Average_Sales_by_Region', 
  TheCount as '# of Dist in state',
  (SELECT sales
   FROM dist d2
   WHERE d2.Region       = d1.Region
     AND d2.company_name = d1.company_name) AS Sales
FROM
(
   SELECT 
     Region, 
     AVG(Sales) avgSales, 
     COUNT(*) theCount
   from dist
   INNER JOIN Regions_US ON dist.state = Regions_US.State
   group by Region,company_name
) AS sub       
ORDER BY avgSales DESC;

Region, company_nameそれがテーブルから来ていると仮定しdistます。

注:クエリで暗黙的な結合構文の代わりに使用INNER JOINしましたが、それらは同じです。

salesしかし、 の各グループの値の一貫性についてはわかりませんRegion, Company_name

于 2013-01-30T13:09:32.490 に答える