2013-03-12 5 views
1

Мне нужно сгруппировать некоторые данные, но из-за наличия 4 изображений хранилища, результат запроса sql query 4 для каждого магазина. Как я могу получить только один для магазина с помощью SQL-запроса?Как получить определенные строки в сгруппированном результате

select s.name,si.SHOP_IMG_PATH,count(*) amount from stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1 
group by s.name,si.SHOP_IMG_PATH 
order by 3 desc,1 asc 

Как вы видите ниже изображения там повторно 4 изображения таким образом запрос может дать случайное изображение

enter image description here

ответ

1
group by s.name, si.SHOP_IMG_PATH 

Вы говорите это, чтобы дифференцировать их по SHOP_IMG_PATH. Следовательно, он показывает 4 результата, по одному для каждого из них.

Вам нужно будет опустить SHOP_IMG_PATH из предложения select, если вы не позволите ему его использовать.

Редактировать

Получил ваш комментарий. То, что вы ищете, это случайное агрегирование. Это достигается в разных версиях SQL. Google для тех, кого вы используете.

Если это Oracle, как указано на вопрос теге, here

+0

Но мне нужен магазин изображение – Talha

+0

Гоча. Ред. – slezica

+0

спасибо за вашу помощь +1 – Talha

1

Вы группирование по s.name, si.SHOP_IMG_PATH он будет рассматривать все возможные комбинации s.name, si.SHOP_IMG_PATH как отдельные вам нужно держать группу только s.name

Попробуйте

SELECT a.NAME, a.PATH, a.AMOUNT 
FROM (select 
    s.name AS 'NAME', si.SHOP_IMG_PATH AS 'PATH', count(*) AS 'AMOUNT', 
    ROW_NUMBER() OVER(PARTITION BY s.name 
          ORDER BY type si.SHOP_IMG_PATH) AS rk 
from 
    stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1 
group by s.name 
order by 3 desc,1 asc) a 
WHERE a.rk = 1; 

Alternative Вы получите результат, но это лишь временное решение и простой альтернативой вашей проблемы, но не хороший.

select s.name AS 'NAME', min(si.SHOP_IMG_PATH) AS 'PATH', count(*) AS 'AMOUNT', 
from 
    stab t 
inner join shop s on (s.shop_id = t.shop_id) 
inner join SHOP_IMG si on (s.shop_id= si.SHOP_ID) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1 
group by s.name 
order by 3 desc,1 asc 

Этот второй запрос возвращает результат в соответствии с вашими потребностями

+0

Привет, он говорит в этой строке «ORDER BY type si.SHOP_IMG_PATH) AS rk« отсутствует правая скобка, но я не видел, где пропало? – Talha

+0

спасибо за помощь +1 – Talha

0

я решить мою проблему, используя ниже запроса,

select s.name,t.shop_id,(select min(SHOP_IMG_PATH) from SHOP_IMG si where shop_id =t.shop_id),count(*) amount from stab t 
inner join shop s on (s.shop_id = t.shop_id) 
where t.acct_id = 111 and t.CR_DATE >= sysDate - 1 
group by s.name,t.shop_id 
order by 4 desc,1 asc 
Смежные вопросы