2011-01-26 1 views
2

注文リストから請求書を生成する必要があります。すべての行の値が等しくなければならないSQL選択クエリ

まだ支払われていない注文(paid_date = null)を取得するクエリがありますが、一部の注文に異なる税金があるという問題があります。今は、そのクエリで注文を同じ税コードと組み合わせることしかできません。

私は以下のようなものを考えていたが、これは明らかに動作しません:

SELECT * from orders 
WHERE paid_date IS NULL AND tax_code = MAX(tax_code); 

ほとんど明確な逆のように。

更新日:
申し訳ありませんが、質問は明確ではないと思います。私は税コードを探していません。私はすべてが同じ税コードを持つ注文のリストを探しています。しかし、私はそれがどのコードであるか気にしません。これは本当に単なるセキュリティ対策です。通常、すべての税コードは同じですが、まれにしか異なります。その場合、ユーザーは2つの別々の請求書を生成する必要があります。

簡単なアイデアはありますか?

+0

これはおそらく「グループごとの最大の」問題のバリエーションです。これを反映するようにタグを更新しました。その結果、いくつかの有用な関連する質問のリンクがあることを願っています。残念なことに、MySQLはこの種のクエリを絶対に駄目です。 –

+0

どの出力が望ましいかは不明です。 4つの税コードがある場合、クエリは何を返すべきですか?あなたは要求された税コードを渡すつもりですか?彼らは単に税コードで注文をソートする必要がありますか?あなたは、同じ税コードで注文の総額を取得しようとしていますか?そうである場合は、OrdersテーブルまたはOrderLineItemsのような別の場所に格納されている注文の合計です。 – Thomas

+0

私は質問を更新しました。 – Remy

答えて

2

あなたはさておき一貫している別の列を指定する必要があります税コードから、たとえばcustomer_ID(たとえば)。

は、現在の顧客のためのtax_codesのリストを取得します:2 tax_codesがあるので、もし

SELECT customer_ID, tax_code 
FROM Orders 
WHERE customer_ID = 'some customer ID' 
GROUP BY customer_ID, tax_code 

は、上記のクエリは、個別の行数を返します。 次に2行を取得し、2つの請求書を生成する必要があります。

次に、あなたが他の人が示されているよう問い合わせることができます。これは、DBへの複数の旅行を伴います

SELECT * FROM Orders 
WHERE paid_date IS NULL 
AND tax_code = 'first tax code from your first query' 

。あるいは、ストアドプロシージャを作成し、一時テーブルを利用し、複数のセット(複数のSELECTステートメント)を返すことができます。各セットには、tax_codeによる注文の表一覧が含まれています。

SQLを使用している場合(MySQLについてはわかりません)、customer_idおよびtax_codeによって階層データを返すSQL XMLクエリを記述できます。

これは役に立ちますか?

0

あなたはtax_codeで注文する必要があるとtax_codeが注文した注文のリストを取得します:

select * from orders 
    where paid_date is null 
order by tax_code 

その後、あなたの結果を反復します。あなたは別のtax_codeを持っているときはいつでも、新しい請求書を生成します。

group_concatはあなたを与えるかもしれない、あなたが欲しいもの:

select tax_code, group_concat(order_id order by order_id) from orders 
    where paid_date is null 
group by tax_code 
-- optionally you can use a LIMIT 1 if you just want orders for the first tax_code 
+0

ありがとう、いいアイデアですが、実際は同じ税金コードを持つすべての注文を返すクエリを探していました。そして、ユーザーは、手動で2番目の請求書を作成するだけです。 – Remy

+0

私が追加したばかりの 'group_concat'を見てください。 –

+1

@Remy - あなたが税コードを渡す場合、明白な仕事ではないでしょう:Select ... TaxCode = 'some passed values' ' – Thomas

1

元のクエリにこだわり、サブクエリはそれを行うだろう:

SELECT * from orders 
WHERE paid_date IS NULL 
    AND tax_code = (
     select max(tax_code) 
     from orders 
     where paid_date is null 
    ) 
+0

うん、それはうまくいくだろう。 問題は、実際のクエリがもう少し複雑なので、サブクエリも同様に複雑になることです。だから私はもっと簡単なものがあることを望んでいたのですか? – Remy

0

この例では、選択したtax_codeの選択方法に関する詳細を私たちに提供していないため、Ordersのリストから任意にtax_codeを選択しました。

Select .. 
From Orders As O 
    Join (
      Select O1.tax_code 
      From Orders As O1 
      Limit 1 
      ) As Z 
     On Z.tax_code = O.tax_code 
Where paid_date Is Null 

ここでの問題は、サブクエリが受注の大半として別のtax_codeに関連付けられている唯一の注文に関連するtax_codeを見つけるかもしれないということです。 "最も一般的な"税コードを見つける別の解決策は次のようになります:

Select .. 
From Orders As O 
    Join (
      Select O1.tax_code 
      From Orders As O1 
      Group By O1.tax_code 
      Order By Count(*) Desc 
      Limit 1 
      ) As Z 
     On Z.tax_code = O.tax_code 
Where paid_date Is Null 
関連する問題