0

クエリがありますが、テーブル内の会社ごとに1つの結果のみを取得するには、クエリをデータベースに変更する必要がありますPrice

このために行を追加GROUP by p.id_firmし、次のクエリを取得します。

SELECT TOP 20 
  p.id_price as p_id_price, 
  p.id_service as p_id_service, 
  p.name as p_name, 
  p.name_original as p_name_original, 
  p.id_producer_country as p_id_producer_country, 
  p.id_firm as p_id_firm, 
  f.name as f_name, 
  f.address as f_address, 
  f.phone as f_phone, 
  city.name as city_name, 
  pc.name as pc_name 
FROM Price p 
left join Firm f 
  on f.id_service=p.id_service 
  AND f.id_city=p.id_city 
  AND f.id_firm=p.id_firm 
left join City city 
  on city.id_city = p.id_city 
left join Producer_country pc 
  on pc.id_producer_country = p.id_producer_country 
WHERE p.id_city='73041' 
  AND p.include='1' 
  AND p.blocked='0' 
  AND f.blocked='0' 
  AND ( f.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS OR p.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS ) 
GROUP by p.id_firm ORDER BY p.name ASC

しかし、それを使用すると、エラーが発生します。

メッセージ8120、レベル16、状態1、行2の列'Price.id_price'は、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です。

このクエリを変更する正しい方法を教えてください。

ここに表示されるすべてのテーブルを構成します

PS:不正確でごめんなさい。会社名と名前の製品で検索します。検索語が製品名または会社名に含まれていて、同じid_firmの結果がいくつかある場合は、最も適切な値を1つ選択する必要があります。つまり、結果検索のid_firmは一意である必要があります。

4

2 に答える 2

1

ROW_NUMBER()グループ化の代わりに使用します。

すべての会社の行に個別に番号を付けます。の行を並べ替えるときROW_NUMBER()は、条件を使用して、p.name LIKE 'Окно%'一致する製品の行を他の行の前に配置します。

これがどのように見えるかの例です:

;
WITH ranked AS (
  SELECT
    p.id_price as p_id_price, 
    p.id_service as p_id_service, 
    p.name as p_name, 
    p.name_original as p_name_original, 
    p.id_producer_country as p_id_producer_country, 
    p.id_firm as p_id_firm, 
    f.name as f_name, 
    f.address as f_address, 
    f.phone as f_phone, 
    city.name as city_name, 
    pc.name as pc_name,
    ROW_NUMBER() OVER (
      PARTITION BY p.id_firm
      ORDER BY
        CASE  -- this criterion puts matching products before non-matching ones
          WHEN p.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS
          THEN 1 ELSE 2
        END,
        p.id_price  -- you may use any sorting criteria at this point,
                    -- just ensure it makes the results predictable
    ) AS rnk
  FROM Price p 
  left join Firm f 
    on f.id_service=p.id_service 
    AND f.id_city=p.id_city 
    AND f.id_firm=p.id_firm 
  left join City city 
    on city.id_city = p.id_city 
  left join Producer_country pc 
    on pc.id_producer_country = p.id_producer_country 
  WHERE p.id_city='73041' 
    AND p.include='1' 
    AND p.blocked='0' 
    AND f.blocked='0' 
    AND ( f.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS
       OR p.name LIKE 'Окно%' COLLATE SQL_Latin1_General_Cp1251_CI_AS ) 
)
SELECT TOP 20
  p_id_price, 
  p_id_service, 
  p_name, 
  p_name_original, 
  p_id_producer_country, 
  p_id_firm, 
  f_name, 
  f_address, 
  f_phone, 
  city_name, 
  pc_name
FROM ranked
WHERE rnk = 1
-- the absence of ORDER BY makes your TOP 20 results indeterminate
;

基本的に、これはすべての会社の行をランク付けし、次に1すべての会社からのランク付けの行のみをプルして、最終的には会社ごとに1つの行にします。

于 2013-03-01T23:11:25.903 に答える
0

可能なクイックフィックスについては、SelectDistinctを試すことができます http://www.w3schools.com/sql/sql_distinct.asp

于 2013-03-02T01:30:40.830 に答える