2011-01-26 1 views
2

Мне нужно сгенерировать счет из списка заказов.SQL select query, где все строки должны иметь равное значение

У меня есть запрос, когда я получаю все заказы, которые еще не были оплачены (paid_date = null), но проблема в том, что некоторые заказы имеют разные налоговые коды. Теперь я могу комбинировать заказы с тем же налоговым кодом в этом запросе.

Я думал о чем-то, как показано ниже, но это, очевидно, не работает:

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

Почти как обратная Distinct.

ОБНОВЛЕНИЕ:
Извините, я думаю, вопрос был не ясен. Я не ищу налоговый код. Я ищу список заказов, которые имеют одинаковый налоговый код. Но мне все равно, какой именно код. Это действительно просто мера безопасности, обычно все налоговые коды одинаковы, но в редких случаях они разные. В этом случае пользователю необходимо создать 2 отдельных счета.

Любые простые идеи?

+0

Это, скорее всего, вариант проблемы «наибольшего числа на группу». Я обновил теги, чтобы отразить это. Надеюсь, в результате есть некоторые полезные связанные вопросы. MySQL, к сожалению, абсолютно отстой для этого типа запросов. –

+0

Непонятно, какой выход нужен. Если у вас есть четыре налоговых кода, что должен вернуть ваш запрос? Вы собираетесь передать запрошенный налоговый код? Должны ли они просто сортировать заказы по налоговому коду? Вы пытаетесь получить общую сумму заказов с одинаковым налоговым кодом? Если да, то общее количество заказа хранится в таблице Orders или в другом месте (например, OrderLineItems). – Thomas

+0

Я обновил вопрос. – Remy

ответ

2

Вам нужно будет определить еще один столбец, который соответствует стороне из налогового кода, например, возможно, customer_ID (например);

Получить список tax_codes для текущего клиента:

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

Этот запрос будет возвращать количество различных строк, поэтому, если есть 2 tax_codes; Затем вы получаете 2 строки, и вам нужно сгенерировать 2 счета;

Тогда вы можете запросить, как другие показали:

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

Это будет включать в себя несколько поездок в БД. Или вы можете написать хранимую процедуру, использовать временные таблицы и вернуть несколько наборов (несколько операторов SELECT), причем каждый набор содержит табличный список заказов с помощью tax_code.

Альтернативно, если вы используете SQL (не знаете о MySQL), вы можете написать запрос SQL XML, который будет возвращать иерархические данные customer_id и tax_code.

Помогает ли это?

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

Спасибо, это хорошая идея, но на самом деле я искал больше запросов, которые просто вернут все заказы, имеющие одинаковый налоговый код. И тогда пользователю просто нужно создать второй счет вручную. – Remy

+0

Взгляните на 'group_concat' Я только что добавил. –

+1

@Remy - Если вы собираетесь передать в налоговый кодекс, то не будет очевидной работы: 'Выберите ... От Закачек, где TaxCode = 'some pass value'' – 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 из списка Заказов, так как вы не предоставили нам никакой информации о том, как будет выбран выбранный 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