LINUX.ORG.RU

unpivot в MySql

 


0

1

Есть вот такое запрос

SELECT info, spec
FROM  
(select '11.11.2019 - 25.11.2019' as shapka1,
count(case when tip=1 then 1 end) as shapka2,
count(case when tip=2 then 1 end) as shapka3,
count(case when tip=3 then 1 end) as shapka4,
140 as shapka6
FROM nsoko12019)   x
UNPIVOT(spec
         FOR  info 
         IN 
         (shapka1, shapka2, shapka3, shapka4, shapka6) );

MySql говорит что синтаксис не верный, не пойму в чем дело, доку гуглится плохо, я даже пока не понял в моей версии MySql это есть или нету...

5.7.27-0ubuntu0.16.04.1



Последнее исправление: Shulman (всего исправлений: 1)

А такое вообще есть в mysql?

comma
()

Ты напиши, что UNPIVOT должен сделать, может помогут

goingUp ★★★★★
()

shapka1, nsoko12019, tip

Убить, выкинуть из окна, сжечь, изнасиловать, снова убить.

shapka1, shapka2, shapka3, shapka4, shapka6

Где shapka5, блеать?

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

MySql говорит что синтаксис не верный, не пойму в чем дело

Я знаю в чём дело. Код такое лютое говнише, что он не вывозит от смрада.

unpivot

Не делается в sql. Он ломает реляционную логику и прикручен костылями сбоку у каждого на свой ляд. Такие вещи делаются на языке общего назначения типа php, delphi или на чём ты там пишешь. Да и вообще делать отчётики на sql - это лютый моветон.

crutch_master ★★★★★
()
Ответ на: комментарий от Anoxemian

А еще судя по вот этому:

FROM nsoko12019

у него там еще и срач прямо в базе из таких табличек. Постыдился бы.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

UNPIVOT

– зло.

WITH тебе в руки, доступен с 8.0, емнип

webmonkey
()

говорит что синтаксис не верный SELECT info, spec

алсо, spec у тебя откуда берется?

webmonkey
()
Ответ на: комментарий от crutch_master

Может они генерятся чем-то. Да и транслит не такое уж редкое явление. Но учитывая личность ТС-а, ты, возможно, прав

anonymous
()
Ответ на: комментарий от anonymous

Да и транслит не такое уж редкое явление.

И это ужасно. Все эти shapka1 читаются в голове как «сшапка» с мерзким акцентом.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Код писал не я, это раз, когда дело зашло в тупик, его отдали мне.

Я в итоге сказал что код не работает из за версии мускуля.

Не офтопь пожалуйста, отвечай по делу

Shulman
() автор топика
Ответ на: комментарий от Shulman

По делу:
Это не делается в sql. Все эти pivot'ы и отчётики в sql - мерзкие костыли, перепиши нормально, если собираешься там оставаться работать.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от Shulman

По делу: нет этого в MySQL. А даже если бы был, запрос всё равно черезжопный. Похоже, автор закинулся майкрософтом.

Слушай кратчмастера. А если тебе кровь из носа нужно на sql, то группируешь каутны по tip, потом юнионом добавляешь нужные строки. Хотя, не факт, что я вообще понял, что конкретно тебе нужно. Тебе ведь обязательно нужно повалять нуба и ничего не пояснить?

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Я считал что из запроса все ясно, нужно повернуть таблицу, пример данных честно писать лень… поскольку уже было сказало но нужен 8 мускуль.

Shulman
() автор топика

Из любопытства посмотрел на пример вывода UNPIVOT из MSSQL и сделал так же:

SELECT info, spec FROM (
  SELECT 'shapka1' AS info, '11.11.2019 - 25.11.2019' AS spec
  UNION ALL
  SELECT 'shapka2', COUNT(CASE WHEN tip = 1 THEN 1 END) FROM nsoko12019
  UNION ALL
  SELECT 'shapka3', COUNT(CASE WHEN tip = 2 THEN 1 END) FROM nsoko12019
  UNION ALL
  SELECT 'shapka4', COUNT(CASE WHEN tip = 3 THEN 1 END) FROM nsoko12019
  UNION ALL
  SELECT 'shapka6', 140
) AS x;
Darth_Revan ★★★★★
()
Последнее исправление: Darth_Revan (всего исправлений: 1)
Ответ на: комментарий от Shulman

нужен 8 мускуль

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

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Хотя, не факт, что я вообще понял, что конкретно тебе нужно.

Просто страшный обфусцированный запрос, а так там всё довольно просто. Я чуть выше переделал с UNPIVOT на (почти) стандартный SQL, там всё понятнее.

то группируешь каутны по tip

Вот тут пригодится WITH, недоступный @Shulman. Да и тут хардкод нужен.

Darth_Revan ★★★★★
()
Последнее исправление: Darth_Revan (всего исправлений: 1)
Ответ на: комментарий от Shulman

Я в итоге сказал что код не работает из-за версии мускуля.

Ведь это работает только в таких версиях мускуля как Oracle Database 11g+ и Microsoft SQL Server 2016+, действительно.

Darth_Revan ★★★★★
()
Последнее исправление: Darth_Revan (всего исправлений: 1)
Ответ на: комментарий от Shulman

Одна беда – вторым столбцом то строки, то числа.

SELECT info, spec FROM (
  SELECT 'shapka1' AS info, '11.11.2019 - 25.11.2019' AS spec
  UNION ALL
  SELECT 'shapka2', CAST(COUNT(CASE WHEN tip = 1 THEN 1 END) AS CHAR) FROM nsoko12019
  UNION ALL
  SELECT 'shapka3', CAST(COUNT(CASE WHEN tip = 2 THEN 1 END) AS CHAR) FROM nsoko12019
  UNION ALL
  SELECT 'shapka4', CAST(COUNT(CASE WHEN tip = 3 THEN 1 END) AS CHAR) FROM nsoko12019
  UNION ALL
  SELECT 'shapka6', '140'
) AS x;

Вот так приведены типы. Длиннее, зато более канонично (не учитывая, что в SQL такие штуки вообще не надо делать, @crutch_master не солгал).

А, ну и раз уж я опять сюда влез, вот ещё вариант с обобщённым табличным выражением (MariaDB 10.2+, Oracle MySQL 8.0+) до кучи, раз уж столько разговоров тут про них:

WITH tips AS (
  SELECT tip, CAST(COUNT(tip) AS CHAR) AS c
  FROM nsoko12019 GROUP BY tip HAVING tip IN (1, 2, 3)
) SELECT info, spec FROM (
  SELECT 'shapka1' AS info, '11.11.2019 - 25.11.2019' AS spec
  UNION ALL
  SELECT 'shapka2', COALESCE(MAX(c), '0') FROM tips WHERE tip = 1
  UNION ALL
  SELECT 'shapka3', COALESCE(MAX(c), '0') FROM tips WHERE tip = 2
  UNION ALL
  SELECT 'shapka4', COALESCE(MAX(c), '0') FROM tips WHERE tip = 3
  UNION ALL
  SELECT 'shapka6', '140'
) AS x;
Darth_Revan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.