Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Вниз

Как правильно написать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.052 c
2-1204288356
boba
2008-02-29 15:32
2008.03.30
Canvas.TextWidth


2-1204027484
Эрни
2008-02-26 15:04
2008.03.30
найти каталог


2-1204259124
Igor23
2008-02-29 07:25
2008.03.30
Проверка строки или нехватка серого вещества )))


15-1203041948
Вещь
2008-02-15 05:19
2008.03.30
Всегда ли функции FloatToStr и StrToFloat делают однозначный


15-1203053813
Tornado
2008-02-15 08:36
2008.03.30
Как подключить к инету два компа?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский