2015-07-24 7 views
0

У меня есть таблица из 3000 экземпляров, которые из 40 разных поставщиков. В MS Access 2013, как бы я случайно выбрал одну запись у каждого из 40 поставщиков?MS Access - выберите одну случайную запись для каждого уникального значения в столбце

Вот код, который я пробовал, но, как я сказал, что это обыкновение дифференцироваться между кодами поставщиков и может дать мне 40 результатов от одного поставщика:

SELECT TOP 40 Vendors.Field1, Vendors.Vendor, Vendors.[Lgl Name], Vendors.[Pymnt Amt] INTO [Random Vendors] 
FROM Vendors ORDER BY Rnd(Field1); 

ответ

0

Это Office Support website дает формулу: Int((upperbound - lowerbound + 1) * Rnd + lowerbound).

Вы могли бы попробовать что-то вроде:

SELECT Vendors.Field1, 
     Vendors.Vendor, 
     Vendors.[Lgl Name], 
     Vendors.[Pymnt Amt] 
INTO [Random Vendors] 
FROM Vendors 
WHERE Vendors.Field1 IN (Int(3000*Rnd(Field1))) 
GROUP BY Vendors.Vendor; 

Это предполагает, что Field1 является номер счета-фактуры. Если это не так, то вам придется JOIN вашей таблице счетов-фактур.

+0

Если я не пропустил какой-то трюк, это еще один способ закончить тем, куда я шел, возможно, даже более сложным способом. Я обновил свой пост с помощью кода, который я пытался, но не делает того, что мне нужно делать. – user2503734

+0

Если вам нужен один поставщик, вам нужно использовать предложение GROUP BY. Также вам нужно каким-то образом отличить, что вы выбираете случайный счет-фактуру. Если у вас 3000 счетов-фактур, вам нужно умножить это на функцию Rnd. Потому что Rnd находится в масштабе от 0 до 1 эксклюзивного. – BJones

+0

Я попробовал группу, и в итоге она вернула все 3000 счетов-фактур. Какова цель умножения результата RND? – user2503734

0

Позвольте мне предположить, что таблица называется invoices и у вас есть таблица с именем vendors, с одной строки на поставщика:

select v.* 
     (select top 1 i.invoiceid 
     from invoices as i 
     where i.vendor = v.vendor 
     order by rnd(i.invoiceid) 
     ) as random_invoiceid 
from vendors as v; 

Если вы хотите детали для счета-фактуры, а затем использовать это в качестве подзапроса:

select i.* 
from (select v.* 
      (select top 1 i.invoiceid 
       from invoices as i 
       where i.vendor = v.vendor 
       order by rnd(i.invoiceid) 
      ) as random_invoiceid 
     from vendors as v 
    ) as vi join 
    invoices as i 
    on i.invoiceid = vi.random_invoiceid; 
+0

Его все один стол. Причина в том, что мне нужно 40 случайных счетов-фактур и сначала выбрали поставщиков, потому что наша система не позволяет мне перейти на уровень счета для всех сразу. Поэтому я выбрал 40 поставщиков и собрал отчет для всех своих счетов за 6 месяцев и экспортировал их. Код на моем посту состоял в том, как я выбрал 40 оригинальных поставщиков. На данный момент эта таблица служит своей цели, и я только отработаю счета. – user2503734

Смежные вопросы