подзапрос произвел более одного элемента - PullRequest
0 голосов
/ 31 мая 2018

Я хочу получить уникальный, at_least_one и общее количество контрактов с sql.Ниже код выдает ошибку: Скалярный подзапрос создал более одного элемента

#standardSQL
WITH estrato_contrato AS (SELECT ESTRATO, CONTRATO, count(*) AS count FROM `mytable` GROUP BY ESTRATO, CONTRATO)


SELECT ESTRATO, COUNT(DISTINCT CONTRATO) AS only_once_contract, sum(count) AS total,
(SELECT COUNT(DISTINCT CONTRATO) FROM estrato_contrato WHERE count > 1 GROUP BY ESTRATO) AS at_least_one
FROM estrato_contrato
GROUP BY ESTRATO

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Попробуйте это

С estrato_contrato AS (ВЫБРАТЬ ЭСТРАТО, КОНТРАТО, считать (*) AS считать из mytable GROUP ПО ЭСТРАТОМ, КОНТРАТОМ)

ВЫБРАТЬ ЭСТРАТО, СЧЕТ (ОТПРАВИТЬ КОНТРАТО) КАК only_once_cont, сумма (количество) КАК итого, СЛУЧАЙ, КОГДА РАСЧЕТ (ОТЛИЧНОЕ КОНТРАТО)> 1, затем 1, иначе 0 заканчивается как at_least_one ОТ estrato_contrato GROUP BY ESTRATO

0 голосов
/ 31 мая 2018

Ниже для BigQuery Standard SQL

Опция без подвыборов

#standardSQL
WITH estrato_contrato AS (
  SELECT ESTRATO, CONTRATO, COUNT(*) AS COUNT FROM  `mytable`  GROUP BY ESTRATO, CONTRATO
)
SELECT 
  ESTRATO, 
  COUNT(CONTRATO) AS only_once_contract, 
  SUM(COUNT) AS total,
  ARRAY_LENGTH(ARRAY_AGG(IF(COUNT > 1, CONTRATO, NULL) IGNORE NULLS)) AS at_least_one
FROM estrato_contrato ec
GROUP BY ESTRATO   

И, наконец, самый простой вариант (примечание: вам не нужно беспокоиться о различных значенияхво внешнем выборе, потому что об этом уже позаботились в estrato_contrato

#standardSQL
WITH estrato_contrato AS (
  SELECT ESTRATO, CONTRATO, COUNT(*) AS COUNT FROM  `mytable` GROUP BY ESTRATO, CONTRATO
)
SELECT 
  ESTRATO, 
  COUNT(CONTRATO) AS only_once_contract, 
  SUM(COUNT) AS total,
  COUNTIF(COUNT > 1) AS at_least_one
FROM estrato_contrato ec
GROUP BY ESTRATO
0 голосов
/ 31 мая 2018

Правильный способ формулирования подзапроса использует предложение корреляции:

SELECT ESTRATO, COUNT(DISTINCT CONTRATO) AS only_once_contract, sum(count) AS total,
       (SELECT COUNT(DISTINCT ec2.CONTRATO)
        FROM estrato_contrato ec2
        WHERE ec2.count > 1
              ec2.ESTRATO = ec.ESTRATO
       ) AS at_least_one
FROM estrato_contrato ec
GROUP BY ESTRATO;

Могут быть другие способы написания запроса, но это является целью вашей версии.

...