Несколько sql запросов в одном: fkn+antitotal | студентам & программистам

sql — Вывод нескольких SELECT-ов в одну таблицу

Postgresql 9.2

Нужно все эти запросы ниже вывести в одну таблицу (собираю статистику)

SELECT "customer"."id", "customer"."email", "customer"."unsubscribed_types"
FROM
    "customer"
WHERE
    "customer"."unsubscribed_types" = 'daily_weekdays'
    OR "customer"."unsubscribed_types" = 'daily_weekends'
    OR "customer"."unsubscribed_types" = 'weekly_free'
    OR "customer"."unsubscribed_types" = 'weekly_best_weekly'
    OR "customer"."unsubscribed_types" = 'special_partner'
    OR "customer"."unsubscribed_types" = 'bonus_activation'
LIMIT 100;

SELECT
    "customer".email,
    "customer".id,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    "customer".unsubscribed_types ISNULL
OR "customer".unsubscribed_types = '' 
LIMIT 100;

SELECT
    "customer".email,
    "customer".id,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    "customer".unsubscribed_types = 'daily_weekdays'
    AND "customer". unsubscribed_types = 'daily_weekends'
    AND "customer".unsubscribed_types = 'weekly_free'
    AND "customer".unsubscribed_types = 'weekly_best_weekly'
    AND "customer".unsubscribed_types = 'special_partner'
    AND "customer".unsubscribed_types = 'bonus_activation';
    LIMIT 100;

SELECT
    "customer".id,
    "customer".email,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    unsubscribed_types = 'daily_weekdays';
LIMIT 100;

Прошу заметить мне не объеденить а вывести статистику(например)

-------------------------------------------------
| Запрос 1 | Сколько нашел людей из 1-го селекта|
|-----------------------------------------------|
| Запрос 2 | Сколько нашел людей из 2-го селекта|
|-----------------------------------------------|
| Запрос 3 | Сколько нашел людей из 3-го селекта|
|-----------------------------------------------|
| Запрос 4 | Сколько нашел людей из 4-го селекта|
-------------------------------------------------
  • sql
  • postgresql
  • запрос-в-запросе






0

можно воспользоваться объединением запросов (union):

select "запрос 1", count(*)
from . .. where ...
union
select "запрос 2", count(*)
from ... where ...
union
...

Предложу такой вариант:
Написать процедуру, в которой:
1) Будет создаваться таблица, определяющая Вашу результирующую таблицу
2) Делать выборки исходной таблицы
3) Проходится по каждой выборки и вставлять данные в таблицу, созданную в 1 пункте

Вот как решил проблему

SELECT
"request_1" AS "Запрос 1",
"request_2" AS "Запрос 2",
"request_3" AS "Запрос 3",
"request_4" AS "Запрос 4"
FROM
(
    -- Исполняем запрос 1
    SELECT count("customer"."id")
    FROM "customer"
    WHERE
        "customer"."unsubscribed_types" = 'daily_weekdays'
        OR "customer"."unsubscribed_types" = 'daily_weekends'
        OR "customer"."unsubscribed_types" = 'weekly_free'
        OR "customer"."unsubscribed_types" = 'weekly_best_weekly'
        OR "customer"."unsubscribed_types" = 'special_partner'
        OR "customer"."unsubscribed_types" = 'bonus_activation'
) AS "request_1",
(
    -- Исполняем запрос 2
    SELECT count("customer". "id")
    FROM "customer"
    WHERE
        "customer"."unsubscribed_types" ISNULL
        OR "customer"."unsubscribed_types" = '{}'
) AS "request_2",
(
    -- Исполняем запрос 3
    SELECT count("customer"."id")
    FROM "customer"
    WHERE
        "customer"."unsubscribed_types" = 'daily_weekdays'
        AND "customer"."unsubscribed_types" = 'daily_weekends'
        AND "customer"."unsubscribed_types" = 'weekly_free'
        AND "customer"."unsubscribed_types" = 'weekly_best_weekly'
        AND "customer"."unsubscribed_types" = 'special_partner'
        AND "customer"."unsubscribed_types" = 'bonus_activation'
) AS "request_3",
(
    -- Исполняем запрос 4
    SELECT count("customer"."id")
    FROM "customer"
    WHERE "unsubscribed_types" = 'daily_weekdays'
) AS "request_4",
;






0







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


python — Как выполнить сразу несколько запросов?


Вопрос задан


Изменён
1 год 4 месяца назад


Просмотрен
455 раз

import cx_Oracle
cx_Oracle. init_oracle_client(lib_dir=r"")
hostname = ''
port = 
SID = 'xe'
username = 'demo'
password = 'demo'
dsn_tns = cx_Oracle.makedsn(hostname, port, SID)
try:
    conn = cx_Oracle.connect(user=username, password=password, dsn=dsn_tns)
except Exception as err:
    print('Exception occured while trying to create a connection', err)
else:
    try:
        cur = conn.cursor()
        sel_1 = """SELECT * FROM ORDERS WHERE STATUS = 'In process' AND CREATOR_ID = 3
AND CREATED_DT = '01-AUG-21' """
        sel_2 = """SELECT COUNT(status) FROM orders WHERE status = 'Closed'"""
        sel_3 = """SELECT FIO, department_name FROM employees e LEFT JOIN departments d
ON (d.department_id = e.department_id)"""
        sel_4 = """SELECT order_id, fio FROM orders o
        LEFT JOIN employees e ON(o.creator_id = e.employee_id)"""
        cur.executemany(sel_1,sel_2,sel_3,sel_4)
        rows = cur.fetchall()
        print(rows)
    except Exception as err:
        print('Excption occured while fetching the records', err)
    else:
        print('Completed')
    finally:
        cur. close()
finally:
    conn.close()

Выдает ошибку:

Excption occured while fetching the records an integer is required (got type str)

  • python
  • sql
  • cx-oracle

Метод cursor.executemany() предназначен для изменения данных (INSERT/UPDARE/DELETE). Идея в том, чтобы запускать один и тот же SQL запрос с разными значениями. Например:

qry = "INSERT INTO table_name (id, name) values(:1, :2)"
records = [(1, "John"), (2, "Jenny"), (3, "Abraham")]
cursor.executemany(qry, records)

В вашем случае, вам надо каждый запрос запускать отдельно и потом использовать cursor.fetchall() для того, чтобы вычитать все записи возвращенные единственным запросом:

cur.execute(sel_1)
for row in cur.fetchall():
    # processing row ...

потом обрабатываем следующий запрос:

cur.execute(sel_2)
for row in cur.fetchall():
    # processing row ...

и т.д.

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






1







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


SQL: два оператора select в одном запросе

Задавать вопрос

спросил

Изменено
3 месяца назад

Просмотрено
471 тысяч раз

Я хочу выбрать информацию из двух таблиц SQL в одном запросе, однако эта информация не связана, поэтому потенциальных соединений не существует.

Примером может быть следующая установка.

tblMadrid

 id | имя | игры | цели
    1 | роналдо | 100 | 100
    2 | бензема | 50 | 25
    3 | тюк | 75 | 50
    4 | Кроос | 80 | 10
 

тблБарселона

 ID | имя | игры | цели
    1 | неймар | 60 | 25
    2 | Месси | 150 | 200
    3 | Суарес | 80 | 80
    4 | иньеста | 40 | 5
 

Я хочу получить запрос, который даст мне следующее:

 имя | игры | цели
Месси | 150 | 200
роналду | 100 | 100
 

Я пытался следовать этой логике: Множественные операторы выбора в одном запросе, но следующий код не работал:

 USE Liga_BBVA
ВЫБЕРИТЕ (ВЫБЕРИТЕ имя,
               игры,
               цели
        ОТ tblMadrid
        ГДЕ name = 'ronaldo') КАК table_a,
       (ВЫБЕРИТЕ имя,
               игры,
               цели
        ОТ tblBarcelona
        ГДЕ имя = 'messi') КАК table_b
Упорядочить по целям
 

Какой-нибудь совет по этому поводу? Спасибо
Информация: Футбол — это просто упрощенный пример. На самом деле невозможно объединить обе таблицы в одну и создать новый столбец «команда». Две таблицы имеют совершенно разные структуры, но мне нужно что-то, что соответствует характеристикам этого примера.

  • sql
  • select

Вы можете сделать что-то вроде этого:

 (SELECT
    имя, игры, голы
    ОТ tblMadrid ГДЕ имя = 'Роналду')
 СОЮЗ
 (ВЫБРАТЬ
    имя, игры, голы
    ОТ tblBarcelona ГДЕ имя = 'месси')
ЗАКАЗАТЬ ПО целям;
 

См., например: https://dev.mysql.com/doc/refman/5.0/en/union.html

1

Если вам нравится вести записи отдельно и не делать объединение.
Попробуйте выполнить запрос ниже

 ВЫБЕРИТЕ (ВЫБЕРИТЕ имя,
               игры,
               цели
        ОТ tblMadrid
        ГДЕ name = 'ronaldo') КАК table_a,
       (ВЫБЕРИТЕ имя,
               игры,
               цели
        ОТ tblBarcelona
        ГДЕ имя = 'messi') КАК table_b
ОТ ДВОЙНОГО
 

2

Оператор UNION — ваш друг:

 SELECT a. playername, a.games, a.goals
ОТ tblMadrid как
ГДЕ a.playername = "ronaldo"
СОЮЗ
ВЫБЕРИТЕ b.имя игрока, b.игры, b.цели
ОТ tblBarcelona as b
ГДЕ b.playername = "месси"
ЗАКАЗАТЬ ПО целям;
 

0

Вы можете объединить запросы, если столбцы совпадают.

 ВЫБЕРИТЕ имя,
       игры,
       цели
ОТ tblMadrid
ГДЕ идентификатор = 1
СОЮЗ ВСЕХ
ВЫБЕРИТЕ имя,
       игры,
       цели
ОТ tblBarcelona
ГДЕ идентификатор = 2
 

Вы можете объединить данные из двух таблиц, сначала упорядочить по наивысшим целям, а затем выбрать две верхние, например:

MySQL

 select *
из (
  выберите * из tblMadrid
  союз всех
  выберите * из tblBarcelona
) все данные
сортировать по описанию целей
предел 0,2;
 

SQL Server

 выбрать верхние 2 *
из (
  выберите * из tblMadrid
  союз всех
  выберите * из tblBarcelona
) все данные
упорядочить по описанию целей;
 

Если вам нужны только Месси и Роналду

 выберите * из tblBarcelona где name = 'messi'
союз всех
выберите * из tblMadrid, где name = 'ronaldo'
 

Чтобы месси оказался вверху результата, можно сделать что-то вроде этого:

 select * from (
  выберите * из tblBarcelona, ​​где имя = 'messi'
  союз всех
  выберите * из tblMadrid, где name = 'ronaldo'
) звезды
заказать по имени;
 

2

 выберите имя, игры, голы
из tblMadrid, где имя = «Роналду»
союз
выберите имя, игры, цели
из tblBarcelona, ​​где name = 'messi'
Упорядочить по целям
 

1

Использование union поможет в этом случае.

Вы также можете использовать соединение по условию, которое всегда возвращает истину и не связано с данными в этих таблицах. См. ниже

 select tmd .name,tbc.goals from tblMadrid tmd join tblBarcelona tbc on 1=1;
 

объединение поможет вам даже в том случае, когда в таблицах нет общих столбцов

0

В этом случае вы можете использовать UNION

 выберите идентификатор, имя, игры, цели из tblMadrid
союз
выберите идентификатор, имя, игры, цели из tblBarcelona
 

вы просто должны поддерживать порядок выбранных столбцов, т.е. идентификатор, имя, игры, цели в обоих SQL

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

выбрать имя, игры, макс (голы) как «большинство голов» из tblRealMadrid
союз
выберите name,games,max(goals) как «больше всего голов» из tblBarcelona

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

plsql — Как запустить несколько SQL-запросов?

спросил

Изменено
3 месяца назад

Просмотрено
105 тысяч раз

У меня есть запрос на создание таблицы, запрос на обновление и затем запрос на удаление таблицы. Мне нужно запустить эти три запроса за один раз. Как лучше всего это сделать?

 Пример
1-й запрос: создайте таблицу A.
2-й запрос: обновить значение в таблице A
3-й запрос: удалить таблицу A.
 

Вместо того, чтобы выполнять эти три запроса один за другим, я хочу запускать их на ходу либо с помощью PLSQL, либо каким-либо другим способом. Пожалуйста помоги.

  • sql
  • plsql

5

Поместите 3 запроса друг за другом через точку с запятой:

 SELECT *
ОТ table_to_be_selected;
DROP TABLE таблица_для_удаления;
TRUNCATE TABLE table_to_be_truncated;
 

Вы можете объединить эти запросы в строку и выполнить эту строку.

0

Почему бы не создать ПРОЦЕДУРА ?

 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ foo
ЯВЛЯЕТСЯ
НАЧИНАТЬ
-- Здесь идет предложение создать. Например:
-- ВЫПОЛНИТЬ НЕМЕДЛЕННО
-- 'СОЗДАТЬ ТАБЛИЦУ bar (.