Транспонирование строк и столбцов без агрегации [дубликат]

Файл уже открыт. open принимает строковое имя файла и создает объект открытого файла, но вам не нужно это делать, потому что объекты в request.files уже являются открытыми файлоподобными объектами.

portfolios = csv.DictReader(request.files['portfolios'])
97
задан Blorgbeard 5 May 2014 в 04:18
поделиться

2 ответа

Ваш запрос очень близок. Вы должны использовать следующее, которое включает в себя subject в конечном списке выбора:

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

См. SQL Fiddle с демонстрацией

150
ответ дан dasblinkenlight 22 August 2018 в 19:04
поделиться
  • 1
    Живой пример всегда экономит время ... лучше, чем MSDN .. :) – Faiz 1 November 2014 в 18:51
  • 2
    Раньше не видел SQL Fiddle. Спасибо, что включили это! – madannes 9 July 2015 в 16:16
  • 3
    SQL Fiddle, кажется, сломан? – liang 17 February 2016 в 19:02
  • 4
    @liang К сожалению, SQL Fiddle имеет тенденцию быть немного ненадежным время от времени. Если вы хотите попробовать ссылку, вам нужно периодически проверять ее. – Taryn♦ 17 February 2016 в 19:05
  • 5
    @LBogaardt Нет, вам нужно явно указать столбцы для включения. – jjjjjjjjjjj 9 February 2017 в 16:32

Вы также можете попробовать стандартный метод sql un-pivoting, используя последовательность логики со следующим кодом. Следующий код имеет 3 шага:

  1. создает несколько копий для каждой строки с использованием cross join (также создавая поле темы в этом случае)
  2. создает столбец «метки» и заполняет соответствующие значения с помощью выражения case (например: если субъектом является наука, тогда выберите значение из научного столбца)
  3. удалять любые нулевые комбинации (если существует, выражение таблицы можно полностью избежать, если в базовой таблице строго нет нулевых значений)
     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;
    
3
ответ дан Rahul Kohli 22 August 2018 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: