Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

Как правильно написать SQL   Найти похожие ветки 

 
Yurij-7   (2008-02-29 14:14) [0]

Уважаемые мастера, прошу помощи.
Есть табличка:

Город                      Продукт        Состояние
*******                 *********
Город2                    Яблоки          Продано
Город2                    Персик          Везут
Город3                    Персик          Везут
Город4                    Банан            На складе

Хочу получить табличку вида:

Город           Продано        Везут      На складе
****************************************
Город2              1                 1
Город3                                 1
Город4                                              1

Не могу собственно понять как написать запрос, есть таблица справочник городов, и таблица товара, напрашивается чтото на вложенный запрос но не пойму как,  
подскажите пож.

Спасибо.


 
Palladin ©   (2008-02-29 14:17) [1]

помнится в юконе появилась новая инструкция pivot, так что если у тебя юкон, он же mssql 2005, то все получится... а может подобная инструкция есть в каких нибудь других СУБД...


 
Yurij-7   (2008-02-29 14:41) [2]

Жаль что не mssql 2005, а My SQL

Просто ен хочется отчет в 3 таблички выносить а хочу в одной и красиво.


 
Palladin ©   (2008-02-29 14:44) [3]

я тоже много чего хочу... твоя хотелка осуществима, но придется написать побольше чем просто один запрос...


 
Yurij-7   (2008-02-29 14:47) [4]

да я понимаю, можно по сути 2 запроса сделать, но как потом в один набор данных  все слить ((  вот не могу я этого понять


 
Yurij-7   (2008-02-29 14:47) [5]

Удалено модератором
Примечание: дубль


 
korneley ©   (2008-02-29 14:49) [6]


>  но как потом в один набор данных  все слить

Вычисляемые поля?


 
Palladin ©   (2008-02-29 14:50) [7]

запроса и одного хватит, тебе результат придется обработать и создать и заполнить таблицу самому в RT


 
palva ©   (2008-02-29 14:52) [8]

Firebird 1.5
SELECT Город, SUM(CASE Состояние WHEN "Продано" THEN 1 ELSE 0 END),
                    SUM(CASE Состояние WHEN "Везут" THEN 1 ELSE 0 END),
FROM табличка GROUP BY Город


 
Johnmen ©   (2008-02-29 14:53) [9]

Значения и количество "Состояний" неизменно и известно?


 
Сергей М. ©   (2008-02-29 14:54) [10]

Обычный группирующий запрос тут просматривается, ничего из ряда вон выходящего.

А вот выполненять его следует, например, компонентом TDecisionQuery, или аналогичным по назначению кросстаб-компонентом, ориентированном на другую СУБД


 
Palladin ©   (2008-02-29 14:54) [11]


> palva ©   (29.02.08 14:52) [8]

мне кажется 1 это не флаг, а количество таких состояний

любая БД :)
select город, состояние, count(продукт) from табличка group by город, состояние


 
Yurij-7   (2008-02-29 15:01) [12]

Спасибо за внимание к моему вопросу
Запрос не вычисляемый, база FB, по сути мне надо по каждому городу вывести в разрезе состояний количество продуктов


 
Yurij-7   (2008-02-29 15:24) [13]

То: Johnmen ©   (29.02.08 14:53) [9]

Да, всего есть 5 состояний
надо просто посчитать любые товары с этими состояниями


 
Yurij-7   (2008-02-29 15:26) [14]

То: Palladin ©   (29.02.08 14:54) [11]

Это я привел пример результирующей выборки, иными словами мне надо такой результат, а 1 это количество продуктов в таком состоянии


 
palva ©   (2008-02-29 15:31) [15]

Если в таблице имеется уникальное значение ID, то можно так:

SELECT A.GOROD, COUNT(B.SOST), COUNT(C.SOST), COUNT(D.SOST)
FROM TABLE1 A
LEFT JOIN TABLE1 B ON B.ID = A.ID AND B.SOST = "Продано"
LEFT JOIN TABLE1 C ON C.ID = A.ID AND C.SOST = "Везут"
LEFT JOIN TABLE1 D ON D.ID = A.ID AND D.SOST = "На складе"
GROUP BY A.GOROD


 
Johnmen ©   (2008-02-29 15:42) [16]


> palva ©   (29.02.08 15:31) [15]

Не-а :)) Грубо ошибаешься...


 
Johnmen ©   (2008-02-29 15:44) [17]


> Yurij-7   (29.02.08 15:24) [13]
> То: Johnmen ©   (29.02.08 14:53) [9]
> Да, всего есть 5 состояний

Ещё один вопрос - какая версия MySQL?


 
Yurij-7   (2008-02-29 15:45) [18]

тоесть в данном примере я вижу что справочник выведен в отдельную таблиу ?


 
Yurij-7   (2008-02-29 15:48) [19]

То:Johnmen ©   (29.02.08 15:44) [17]

MySQL - 3.23.37


 
Johnmen ©   (2008-02-29 15:55) [20]


> Yurij-7   (29.02.08 15:48) [19]

Тогда вид в [0] получить невозможно никаким, сколь угодно сложным, запросом.


 
Johnmen ©   (2008-02-29 15:59) [21]

...хотя вру :)
Сделав ограничивающее допущение [9], схема запроса примерно такая:
SELECT
 Город,
 SUM(IF("Продано",1,0)),
 SUM(IF("Везут",1,0)),
 ...
FROM Table
GROUP BY Город


 
Yurij-7   (2008-02-29 16:00) [22]

То: Johnmen ©   (29.02.08 15:55) [20]
Но я же видел подобную реализацию на MS SQL , что же делать?
надо через промежуточную таблицу делать?

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


 
palva ©   (2008-02-29 16:05) [23]

> Тогда вид в [0] получить невозможно никаким, сколь угодно сложным, запросом.
[15] должно работать, поскольку все по стандарту.
Кроме того, в MySQL есть функция IF. [8] можно переписать так: вместо
SUM(CASE Состояние WHEN "Продано" THEN 1 ELSE 0 END)
написать
SUM(IF(Состояние = "Продано", 1, 0)


 
Сергей М. ©   (2008-02-29 16:07) [24]

А чем собссно решение [10] смущает/не устраивает ?

Оно же очевидно - если есть готовые компоненты для кросстаб-запросов, почему бы ими не воспользоваться ?


 
Johnmen ©   (2008-02-29 16:09) [25]


> palva ©   (29.02.08 16:05) [23]
> [15] должно работать, поскольку все по стандарту.

Работать будет. Результат работы будет кривой :)


 
Palladin ©   (2008-02-29 16:11) [26]


> Сергей М. ©   (29.02.08 16:07) [24]

ну видимо никто просто не умеет Decision Cube готовить :)


 
Сергей М. ©   (2008-02-29 16:15) [27]


> Palladin ©   (29.02.08 16:11) [26]


Научиться-то пара пустяков)
Тут другое тормозит - БДЕ для него вынь да положь)
Но в кач-ве подручного учебного материала оч даже подойдет.


 
palva ©   (2008-02-29 16:17) [28]


> Работать будет. Результат работы будет кривой :)

А разве нужно не кривой? Автору важно чтобы работал правильно. У меня в запросе где-то ошибка?


 
palva ©   (2008-02-29 16:21) [29]


> Johnmen ©   (29.02.08 15:59) [21]
> SELECT
>  Город,
>  SUM(IF("Продано",1,0)),

SUM(IF(Состояние = "Продано",1,0)),


 
ANB   (2008-02-29 16:22) [30]

селект Город_Имя,
 (селект каунт(*) фром Товары Т вере Т.Город = Г.Город энд Т.Состояние = "Везут") "Везут",
 (селект каунт(*) фром Товары Т вере Т.Город = Г.Город энд Т.Состояние = "На складе") "На складе",
 (селект каунт(*) фром Товары Т вере Т.Город = Г.Город энд Т.Состояние = "Воруют") "Воруют"
фром Города Г


 
ANB   (2008-02-29 16:24) [31]


> ну видимо никто просто не умеет Decision Cube готовить :
> )

Он тут ни на фиг не нужен.


 
Palladin ©   (2008-02-29 16:27) [32]

я такие решения называю: через "там где не светит солнце"
тройная выборка (четверная, пятерная,... икстерная? ) не считая главной


 
Johnmen ©   (2008-02-29 16:31) [33]


> palva ©   (29.02.08 16:17) [28]
> А разве нужно не кривой? Автору важно чтобы работал правильно. У
> меня в запросе где-то ошибка?

Обычно да, ожидается прямой. Т.е. ожидаемый. Он же правильный :)
У тебя в запросе сущностная ошибка, не синтаксическая.


> palva ©   (29.02.08 16:21) [29]

Я же сказал явно - "схема".


 
Johnmen ©   (2008-02-29 16:32) [34]


> ANB   (29.02.08 16:22) [30]

Как ты думаешь, я просто так спрашивал [17]?


 
Yurij-7   (2008-02-29 16:38) [35]

То:Сергей М. ©   (29.02.08 16:07) [24]

Дело в том что я вывожу в вэб отчет потому собственно и вариант не подходит, но за идею спасибо, я слышал краем уха чуть о трехмерных данных


 
Palladin ©   (2008-02-29 16:39) [36]


> Yurij-7   (29.02.08 16:38) [35]

то есть таблицу сам рисуешь?


 
palva ©   (2008-02-29 16:44) [37]

> У тебя в запросе сущностная ошибка, не синтаксическая.

Сущностная? Чего-то не понимаю я в этой жизни.


 
Palladin ©   (2008-02-29 16:46) [38]


> palva ©   (29.02.08 16:44) [37]

того что нужно не 1,0, а количество товара сгруппированных по городу и состоянию о чем я тебе и сказал в Palladin ©   (29.02.08 14:54) [11]


 
Yurij-7   (2008-02-29 16:48) [39]

То: Palladin ©   (29.02.08 16:39) [36]

Ну как, делаю запрос, получаю НД, а потом его в вэб страничку переношу


 
Palladin ©   (2008-02-29 16:48) [40]

о, туплю и невнимателен, просшу просчения... у тебя же там функции стоят...


 
Palladin ©   (2008-02-29 16:58) [41]


> Yurij-7   (29.02.08 16:48) [39]

тогда все очень просто...

Var
Col,Cols,Rows:TStringList;
i,n:Integer;
strHTMLTable:String;

Cols:=TStringList.Create;
Rows:=TStringList.Create;
Cols.Sorted:=True;
Rows.Sorted:=True;
q.sql.text:="select город, состояние, count(продукт) from табличка group by город, состояние";
q.Open;
While not q.Eof Do
Begin
 n:=Rows.IndexOf(q.Fields[0].AsString);
 If n=-1 Then n:=Rows.AddObject(q.Fields[0].AsString,TStringList.Create);
 Col:=TStringList(Rows.Objects[n]);
 If Cols.IndexOf(q.Fields[1].AsString)=-1 Then Cols.Add(q.Fields[1].AsString);
 Col.AddObject(q.Fields[1].AsString,TObject(q.Fields[2].AsInteger));
 q.Next;
End;

strHTMLTable:="<table>";
For i:=0 to Rows.Count-1 Do
Begin
 Col:=TStringList(Rows.Objects[i]);
 Col.Sorted:=True;
 strHTMLTable:=strHTMLTable+"<tr>";
 For j:=0 to Cols.Count-1 Do
  Begin
   n:=Col.IndexOf(Cols[j]);
   If n=-1
    Then strHTMLTable:=strHTMLTable+"<td>0</td>"
    Else strHTMLTable:=strHTMLTable+"<td>"+IntToStr(Integer(Col.Objects[n]))+"</td>";
  End;
 strHTMLTable:=strHTMLTable+"</tr>";
 Col.Free;
End;
q.Close;

Cols.Free;
Rows.Free;


могут быть ошибки, писал здесь


 
palva ©   (2008-02-29 17:00) [42]


> того что нужно не 1,0, а количество товара сгруппированных
> по городу и состоянию о чем я тебе и сказал в Palladin ©
>   (29.02.08 14:54) [11]
>

Мой запрос выдает что-то другое?
Претензии ведь не к тому, что мой запрос выдает неправильные данные или работает неэффективно. Здесь вопросов не возникает.
Претензии к тому, что он кривой и имеет сущностные ошибки...


 
Johnmen ©   (2008-02-29 17:00) [43]


> palva ©   (29.02.08 16:44) [37]
> Сущностная? Чего-то не понимаю я в этой жизни.

Наверное.

Хотя, я не прав, и запрос [15] верен в сущности - не разлядел слова LEFT.


 
Johnmen ©   (2008-02-29 17:01) [44]


> Претензии к тому, что он кривой и имеет сущностные ошибки...

Сарказм неуместен, ИМХО.


 
Yurij-7   (2008-02-29 17:10) [45]

То: ANB   (29.02.08 16:22) [30]

А это под какую СУБД вы написали, просто у меян под MySQL не работает,
я так понимаю что конструкция вида
SELECT a.Город, (

SELECT count( Продукт )

не поддерживается ((((


 
Yurij-7   (2008-02-29 17:19) [46]

То: Palladin ©   (29.02.08 16:58) [41]

Спасибо за помощь, чесно сказать даже неудобно что вы столько кода написали.
но я это делаю через связку MySQL + PHP, в Делфи я то примерно понимаю как сделать ....


 
Yurij-7   (2008-02-29 17:24) [47]

То: Johnmen ©   (29.02.08 15:59) [21]

к сожалению вообще не работает ((


 
palva ©   (2008-02-29 17:29) [48]


Johnmen ©   (29.02.08 17:01) [44]
> Сарказм неуместен, ИМХО.

Извините, если обидел. Мне было важно найти изъян в своих собственных представлениях о мире и SQL.


 
Palladin ©   (2008-02-29 17:32) [49]


> Yurij-7   (29.02.08 17:19) [46]

если уловил суть содеяного, можешь и на PHP портировать
все что не касается Delphi постится в Прочее, что бы не путать отвечающих


 
Anatoly Podgoretsky ©   (2008-02-29 23:42) [50]

> Johnmen  (29.02.2008 14:53:09)  [9]

Даже если известно и неизменно, но это не отметает законов Паркинсона.EDе так уж и редок, если не заниматься батонокидательством. Вариант с Control гарантирует результат, вариант с Components не всегда.


 
Johnmen ©   (2008-03-01 02:26) [51]


> palva ©   (29.02.08 17:29) [48]
> Извините, если обидел.

Меня обидеть невозможно.
А то, что на "вы" - не извиню :)
И, кстати, надо было сразу же настаивать на верности своего ответа в доходчивой форме - типа "проверил - результат абсолютно верный"...

Yurij-7   (29.02.08 17:24) [47]
> То: Johnmen ©   (29.02.08 15:59) [21]
> к сожалению вообще не работает ((

Так это же схема. Ты что, следующие посты не читал???

Anatoly Podgoretsky ©   (29.02.08 23:42) [50]

Это пусть автор переживает. Его предупредили :))


 
Германн ©   (2008-03-01 02:46) [52]

Во! Именно тут APClient и перенервничал!
Anatoly Podgoretsky ©   (29.02.08 23:42) [50]


 
Anatoly Podgoretsky ©   (2008-03-01 02:47) [53]

> Германн  (01.03.2008 02:46:52)  [52]

Ну он не выдержал такого позора.


 
Anatoly Podgoretsky ©   (2008-03-01 02:48) [54]

> Anatoly Podgoretsky  (01.03.2008 02:47:53)  [53]

Кстати я в отпуске и запускаю свой сервер, наконец получил все железо.
А какие правильные SQL я буду на нем писать.


 
Германн ©   (2008-03-01 02:56) [55]


> Anatoly Podgoretsky ©   (01.03.08 02:48) [54]
>
> > Anatoly Podgoretsky  (01.03.2008 02:47:53)  [53]
>
> Кстати я в отпуске и запускаю свой сервер, наконец получил
> все железо.
> А какие правильные SQL я буду на нем писать.
>

Поздравляю! И с отпуском, и с получением железа. Зависть гложет меня по обоим пунктам :)
По поводу "правильных SQL", я надеюсь, мы ещё потрепемся. :)
(Хоть я и ламер в SQL :)


 
Yurij-7   (2008-03-02 13:59) [56]

Наконецто получилось инет возобновить.
спасибо всем за ответы, пошел по пути
Johnmen ©   (29.02.08 15:59) [21]

а именно
SELECT name, a.st1, a.st2, a.st3
FROM

(
SELECT braqnch_manager,
count( if(STATUS = "Статус1", 1, NULL ) ) AS st1,
count( if(STATUS = "Статус2", 1, NULL ) ) AS st2,
count( if(STATUS = "Статус3", 1, NULL ) ) AS st3
FROM cs
GROUP BY braqnch
) AS a

left JOIN spr_name ON branch = a.braqnch_manager
ORDER BY branch

Но что самое интересное не работает чтотос псевдонимами My SQL а именно ( запрос) as A а к нему присоединяю имена регионов .....

еслу у кого есть коментарии буду благодарен ...


 
Johnmen ©   (2008-03-02 14:55) [57]


> Yurij-7   (02.03.08 13:59) [56]

Ну, во-первых, я этого не предлагал, ни в каком виде. И предложить не мог, ибо на основании [19] запросы из запросов и вложенные запросы отсутствуют.
Я предлагал [21], уточнено [23].
Также стОит обратить внимание на [15].
А в общем настоятельно рекомендую всё же читать ответы. Все и внимательно.



Страницы: 1 2 вся ветка

Текущий архив: 2008.03.30;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.052 c
15-1203270471
Kostafey
2008-02-17 20:47
2008.03.30
С днем рождения ! 17 февраля


15-1202826005
arreke
2008-02-12 17:20
2008.03.30
AnimationEffect


15-1203010024
DillerXX
2008-02-14 20:27
2008.03.30
MS VS 200{5|8} и параллельная компиляция одного проекта


15-1203341714
Andy BitOff
2008-02-18 16:35
2008.03.30
Город Delphimaster


15-1203444046
MonsterHell
2008-02-19 21:00
2008.03.30
Переопределение днс