5

私はSQLに完全に慣れていないので、SQLに関するStackOverflowの投稿を読んで、これを理解しようとしました。また、他のソースもあり、SQLではこれを実行できません。ここに行く...

3列と数千行のテーブルがあり、最初の2列のデータがあります。3番目の列は現在空であり、1番目と2番目の列に既にあるデータに基づいて3番目の列にデータを入力する必要があります。

最初の列に州があり、2番目の列に果物のエントリがあるとします。各果物が由来するさまざまな状態の数を計算し、この人気のある数値をすべての行の3番目の列に挿入するSQLステートメントを作成する必要があります。その行の人気数1は、果物が1つの州からのみ来ていることを意味し、人気数4は、果物が4つの州から来ていることを意味します。したがって、私のテーブルは現在次のようになっています。

state     fruit     popularity

hawaii    apple     
hawaii    apple     
hawaii    banana       
hawaii    kiwi      
hawaii    kiwi      
hawaii    mango        
florida   apple      
florida   apple        
florida   apple        
florida   orange      
michigan  apple     
michigan  apple     
michigan  apricot   
michigan  orange    
michigan  pear      
michigan  pear      
michigan  pear      
texas     apple     
texas     banana    
texas     banana    
texas     banana    
texas     grape     

そして、人気という名前の3番目の列を計算して更新する方法を理解する必要があります。これは、その果物を輸出している州の数です。目標は、下の表を作成することです。上の表に基づいて、「リンゴ」は4つの州すべてに表示され、オレンジとバナナは2つの州に表示され、キウイ、マンゴー、洋ナシ、ブドウは1つだけに表示されます。状態、したがってそれらの対応する人気数。

state     fruit     popularity

hawaii    apple     4
hawaii    apple     4
hawaii    banana    2   
hawaii    kiwi      1
hawaii    kiwi      1
hawaii    mango     1   
florida   apple     4 
florida   apple     4   
florida   apple     4   
florida   orange    2  
michigan  apple     4
michigan  apple     4
michigan  apricot   1
michigan  orange    2
michigan  pear      1
michigan  pear      1
michigan  pear      1
texas     apple     4
texas     banana    2
texas     banana    2
texas     banana    2
texas     grape     1

私の小さなプログラマーの頭脳は、ある種のスクリプトでデータをループする方法を見つけようと言っていますが、SQLとデータベースについて少し読んでみると、SQLで長くて遅いループスクリプトを書かないようです。できるかどうかさえわかりませんか?しかし、代わりに、SQLでこれを行うためのより良い/より速い方法があります。

SQLステートメントで、各行の3番目の列を計算して更新する方法を知っている人はいますか?これはここでは人気と呼ばれ、各果物が由来する状態の数に対応していますか?読んでくれてありがとう、助けてくれてとても感謝しています。

これまでのところ、以下のSQLステートメントを試しましたが、出力されますが、必要なものが得られません。

--outputs those fruits appearing multiple times in the table
SELECT fruit, COUNT(*)
  FROM table 
 GROUP BY fruit
HAVING COUNT(*) > 1
 ORDER BY COUNT(*) DESC

--outputs those fruits appearing only once in the table
SELECT fruit, COUNT(*)
  FROM table 
 GROUP BY fruit
HAVING COUNT(*) = 1

--outputs list of unique fruits in the table
SELECT COUNT (DISTINCT(fruit))
  FROM table
4

7 に答える 7

4

優先度を使用してテーブルを単純に更新する場合は、次のようになります。

update my_table x
   set popularity = ( select count(distinct state) 
                        from my_table
                       where fruit = x.fruit )

データを選択する場合は、分析クエリを使用できます。

select state, fruit
     , count(distinct state) over ( partition by fruit ) as popularity
  from my_table

これにより、フルーツごとに異なる状態の数が提供されます。

于 2012-08-01T14:45:06.370 に答える
1

私はこれを実行し、(私が思うに)あなたが望むものを手に入れました:

WITH t
  AS (SELECT 'hawaii' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'hawaii' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'hawaii' as STATE, 'banana' as fruit FROM dual
      UNION ALL
      SELECT 'hawaii' as STATE, 'kiwi' as fruit FROM dual
      UNION ALL
      SELECT 'hawaii' as STATE, 'kiwi' as fruit FROM dual
      UNION ALL
      SELECT 'hawaii' as STATE, 'mango' as fruit FROM dual
      UNION ALL
      SELECT 'florida' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'florida' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'florida' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'florida' as STATE, 'orange' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'apricot' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'orange' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'pear' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'pear' as fruit FROM dual
      UNION ALL
      SELECT 'michigan' as STATE, 'pear' as fruit FROM dual
      UNION ALL
      SELECT 'texas' as STATE, 'apple' as fruit FROM dual
      UNION ALL
      SELECT 'texas' as STATE, 'banana' as fruit FROM dual
      UNION ALL
      SELECT 'texas' as STATE, 'banana' as fruit FROM dual
      UNION ALL
      SELECT 'texas' as STATE, 'banana' as fruit FROM dual
      UNION ALL
      SELECT 'texas' as STATE, 'grape' as fruit FROM dual)
SELECT state,
       fruit,
       count(DISTINCT state) OVER (PARTITION BY fruit) AS popularity
  FROM t;

戻ってきた

florida     apple   4
florida     apple   4
florida     apple   4
hawaii      apple   4
hawaii      apple   4
michigan    apple   4
michigan    apple   4
texas       apple   4
michigan    apricot 1
hawaii      banana  2
texas       banana  2
texas       banana  2
texas       banana  2
texas       grape   1
hawaii      kiwi    1
hawaii      kiwi    1
hawaii      mango   1
florida     orange  2
michigan    orange  2
michigan    pear    1
michigan    pear    1

明らかに、実行する必要があるのは次のとおりです。

SELECT state,
       fruit,
       count(DISTINCT state) OVER (PARTITION BY fruit) AS popularity
  FROM table_name;

それが役に立てば幸い...

于 2012-08-01T14:48:57.933 に答える
0

あなたのテーブルが#fruit...

各果物のさまざまな状態を数えるには

select fruit, COUNT(distinct state) statecount from #fruit group by fruit

したがって、これらの値でテーブルを更新します

update #fruit
set popularity
    = statecount
from
 #fruit
    inner join 
      (select fruit, COUNT(distinct state) statecount from #fruit group by fruit) sc
        on #fruit.fruit = sc.fruit
于 2012-08-01T14:42:59.233 に答える
0

これにより、ほとんどの方法でそこに到達するはずです。基本的に、果物が入っている明確な状態の数を取得し、それを使用して元のテーブルに結合します。

update table
set count = cnt
from 
  (
    select fruit, count(distinct state) as cnt 
    from table
    group by fruit) cnts
  inner join table t
    on cnts.fruit = t.fruit
于 2012-08-01T14:43:09.217 に答える
0

別のオプション:

SELECT fruit
,      COUNT(*)
FROM
(
SELECT state
,      fruit
,      ROW_NUMBER() OVER (PARTITION BY state, fruit ORDER BY NULL) rn
FROM   t
)
WHERE rn = 1
GROUP BY fruit
ORDER BY fruit;
于 2012-08-01T14:45:19.450 に答える
0

これを試して:

select a.*,b.total
from [table] as a
left join 
(
SELECT fruit,count(distinct [state]) as total
  FROM [table]
  group by fruit
) as b
on a.fruit = b.fruit

これはSQLServerコードであることに注意してください。必要に応じて、独自の調整を行ってください。

于 2012-08-01T14:49:07.260 に答える
0

これを試して

create table states([state] varchar(10),fruit varchar(10),popularity int)
INSERT INTO states([state],fruit) 
VALUES('hawaii','apple'),
('hawaii','apple'),     
('hawaii','banana'),       
('hawaii','kiwi'),      
('hawaii','kiwi'),      
('hawaii','mango'),        
('florida','apple'),      
('florida','apple'),        
('florida','apple'),        
('florida','orange'),      
('michigan','apple'),     
('michigan','apple'),     
('michigan','apricot'),   
('michigan','orange'),    
('michigan','pear'),      
('michigan','pear'),      
('michigan','pear'),      
('texas','apple'),     
('texas','banana'),    
('texas','banana'),    
('texas','banana'),
('texas','grape')

update t set t.popularity=a.cnt
from states t inner join
(SELECT fruit,count(distinct [state]) as cnt
  FROM states
  group by fruit) a
on t.fruit =a.fruit 
于 2012-08-01T15:08:07.283 に答える