powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CASE, DECODE и траспонирование таблиц в SQLite!
4 сообщений из 4, страница 1 из 1
CASE, DECODE и траспонирование таблиц в SQLite!
    #36456792
init01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем-то надо всего лишь вот из такой таблицы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
PROJECT      DIRECTORY    SIZE
project01   directory01   1100
project01   directory02   1200
project01   directory03   1300
project01   directory04   1400
project02   directory01   2100
project02   directory02   2200
project02   directory03   2300
project02   directory04   2400

сотворить вот такую:

Код: plaintext
1.
2.
PROJECT DIRECTORY01 DIRECTORY02 DIRECTORY03 DIRECTORY04 TOTAL
project01   1100      1200        1300        1400       5000
project02   2100      2200        2300        2400       9000

Я так понимаю, что DECODE в SQLite нету:

Код: plaintext
1.
2.
3.
4.
5.
sqlite> select PROJECT, decode(DIRECTORY,'directory01',SIZE),
decode(DIRECTORY,'directory02',SIZE),
decode(DIRECTORY,'directory03',SIZE),
decode(DIRECTORY,'directory04',SIZE)
from PRSIZE;
Error: no such function: decode

Прелестно!

А вот что вытворяет CASE:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sqlite> select PROJECT,
case when DIRECTORY='directory01' then SIZE end DIRECTORY01,
case when DIRECTORY='directory02' then SIZE end DIRECTORY02,
case when DIRECTORY='directory03' then SIZE end DIRECTORY03,
case when DIRECTORY='directory04' then SIZE end DIRECTORY04
from PRSIZE;
project01| 1100 |||
project02| 2100 |||
project01|| 1200 ||
project02|| 2200 ||
project01||| 1300 |
project02||| 2300 |
project01|||| 1400 
project02|||| 2400 

Очень нездоровый ответ. Я надеялся вот на такой:

Код: plaintext
1.
project01| 1100 | 1200 | 1300 | 1400 
project02| 2100 | 2200 | 2300 | 2400 

Может применить GROUP BY? Ага, как же:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sqlite> select PROJECT,
case when DIRECTORY='directory01' then SIZE end DIRECTORY01,
case when DIRECTORY='directory02' then SIZE end DIRECTORY02,
case when DIRECTORY='directory03' then SIZE end DIRECTORY03,
case when DIRECTORY='directory04' then SIZE end DIRECTORY04
from PRSIZE group by PROJECT;
project01|||| 1400 
project02|||| 2400 

О! Красотища! Он вообще показывает только то, что было в последнем CASE.
Может значения прячутся между палочками? Мечтать не вредно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
sqlite> select PROJECT, DIRECTORY01 from (
select PROJECT,
case when DIRECTORY='directory01' then SIZE end DIRECTORY01,
case when DIRECTORY='directory02' then SIZE end DIRECTORY02,
case when DIRECTORY='directory03' then SIZE end DIRECTORY03,
case when DIRECTORY='directory04' then SIZE end DIRECTORY04
from PRSIZE group by PROJECT);
project01|
project02|

Вот и весь ответ. Ничего между палочками не прячется.
И вот так тоже весело:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sqlite> select PROJECT,
case when DIRECTORY='directory01' then SIZE end ||
case when DIRECTORY='directory02' then SIZE end ||
case when DIRECTORY='directory03' then SIZE end ||
case when DIRECTORY='directory04' then SIZE end
from PRSIZE;
project01|
project02|
project01|
project02|
project01|
project02|
project01|
project02|

В общем загадочная моя душа просит помощи рассказать как же в SQLite транспонировать всё это дело?
Или может есть какие-то другие способы, пусть даже извращенские, я их рассмотрю.




___________________________________________________________________________
Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной.
...
Рейтинг: 0 / 0
CASE, DECODE и траспонирование таблиц в SQLite!
    #36457251
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
select PROJECT,
sum(case when DIRECTORY='directory01' then SIZE end) DIRECTORY01,
sum(case when DIRECTORY='directory02' then SIZE end) DIRECTORY02,
sum(case when DIRECTORY='directory03' then SIZE end) DIRECTORY03,
sum(case when DIRECTORY='directory04' then SIZE end) DIRECTORY04
from PRSIZE group by PROJECT
PS: Матчасть страдает ...
...
Рейтинг: 0 / 0
CASE, DECODE и траспонирование таблиц в SQLite!
    #36457359
init01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev

Точно страдает. Думал SUM - это что-то для INTEGER, поэтому не задумываясь выкинул его, теперь прийдётся читать что же это всё таки такое?

Заработало!

Но
ещё пара вопросов:
1. А почему
Код: plaintext
1.
2.
3.
4.
5.
6.
select PROJECT,
sum(case when DIRECTORY='directory01' then SIZE end) DIRECTORY01,
sum(case when DIRECTORY='directory02' then SIZE end) DIRECTORY02,
sum(case when DIRECTORY='directory03' then SIZE end) DIRECTORY03,
sum(case when DIRECTORY='directory04' then SIZE end) DIRECTORY04,
sum(SIZE) TOTAL
from PRSIZE;
без group by PROJECT выдаёт только последний результат - логику хочется понять.

2. Почему у меня название колонок не высвечивается? Это от настроек самого SQLite зависит? Мне они не нужны, просто опять логику хочется понять.




___________________________________________________________________________
Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной.
...
Рейтинг: 0 / 0
CASE, DECODE и траспонирование таблиц в SQLite!
    #36458655
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Im27th1. А почему
Код: plaintext
1.
2.
3.
4.
5.
6.
select PROJECT,
sum(case when DIRECTORY='directory01' then SIZE end) DIRECTORY01,
sum(case when DIRECTORY='directory02' then SIZE end) DIRECTORY02,
sum(case when DIRECTORY='directory03' then SIZE end) DIRECTORY03,
sum(case when DIRECTORY='directory04' then SIZE end) DIRECTORY04,
sum(SIZE) TOTAL
from PRSIZE;
без group by PROJECT выдаёт только последний результат - логику хочется понять.Он выдает не последний результат, а сумму всех строк. Значение колонки PROJECT при этом может быть абсолютно любым и обычно равняется последней (или первой) физической строке в таблице.
В принципе, данный запрос является нарушением стандарта и должен бы выдавать ошибку о недопустимости свободных полей (PROJECT) в запросе с аггрегатами.

Im27th2. Почему у меня название колонок не высвечивается? Это от настроек самого SQLite зависит? Мне они не нужны, просто опять логику хочется понять.SQLite это база данных, у нее в принципе нет и не может быть никаких "высвечиваний имен колонок".
Если тебя интересуют имена колонок у стандартной консольной утилиты sqlite3.exe то дай ей команду .help и увидишь ответ на свой вопрос.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / CASE, DECODE и траспонирование таблиц в SQLite!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]