Используйте условия WHERE в качестве имен столбцов в результатах запроса - PullRequest
2 голосов
/ 27 февраля 2020

Таблица SQL Скрипка

CREATE TABLE Campaigns (
    Campaign_ID VARCHAR(255),
    Input_Date DATE,
    Start_Date DATE,
    Delivery_Date DATE,
    Offered_Quantity VARCHAR(255),
    Sold_Quantity VARCHAR(255)
);

INSERT INTO Campaigns
(Campaign_ID, Input_Date, Start_Date, Delivery_Date , Offered_Quantity, Sold_Quantity)
VALUES 
("C001","2018-02-16", "2018-03-23","2018-01-25", "500", "300"),
("C002","2018-02-16", "2018-05-12","2018-05-25", "600", "700"),
("C003","2018-02-16", "2018-06-18","2018-06-30", "900", "400"),
("C004","2019-06-20", "2019-07-15","2019-08-02", "930", "800"),
("C005","2019-06-20", "2019-08-02","2017-04-14", "150", "120"),
("C006","2019-06-20", "2019-09-23","2020-10-08", "430", "400"),
("C007","2019-06-20", "2019-11-27","2019-11-26", "850", "900"),
("C008","2019-12-03", "2020-02-08","2020-05-23", "730", "650"),
("C009","2019-12-03", "2020-03-16","2020-02-14", "580", "930");

В приведенной выше таблице данных содержится campaigns, в которой
a) Delivery_Date предшествует Start_Date или
b) Quantity_Sold выше, чем Quantity_Offered.

Чтобы идентифицировать эти campaigns, я использую следующий запрос:

SELECT
Input_Date,
Start_Date,
Delivery_Date,
Offered_Quantity,
Sold_Quantity
FROM Campaigns
WHERE Delivery_Date < Start_Date
OR Sold_Quantity > Offered_Quantity
GROUP BY 1;

Теперь я хочу использовать WHERE-Conditions в запросе как column names для результатов и COUNT Campaign_ID, который заполняет один из обоих WHERE-Conditions.

Результат должно выглядеть так:

Input Date   Delivery_Date < Start_Date    Quantity_Sold > Quantity_Offered
2018-02-16            1                                 1
2019-06-20            2                                 1
2019-12-03            1                                 1

Что мне нужно изменить в моем запросе, чтобы получить этот результат?

Ответы [ 5 ]

2 голосов
/ 27 февраля 2020
SELECT Input_Date,
       SUM(Delivery_Date < Start_Date) `Delivery_Date < Start_Date`,
       SUM(Quantity_Sold > Quantity_Offered) `Quantity_Sold > Quantity_Offered`
FROM Campaigns
WHERE Delivery_Date < Start_Date
   OR Quantity_Sold > Quantity_Offered
GROUP BY Input_Date;
1 голос
/ 27 февраля 2020

Попробуйте:

SELECT Input_Date,
SUM(CASE WHEN Delivery_Date < Start_Date THEN 1 ELSE 0 END) AS DelDateBefore,
SUM(CASE WHEN Sold_Quantity > Offered_Quantity THEN 1 ELSE 0 END) as SoldHigher
FROM Campaigns
WHERE Delivery_Date < Start_Date
OR Sold_Quantity > Offered_Quantity
GROUP BY Input_Date;

См. SQL Скрипка

1 голос
/ 27 февраля 2020
SELECT
  Input_Date,
  SUM(Delivery_Date < Start_Date) AS ` Delivery_Date < Start_Date `,
  SUM(Quantity_Sold > Quantity_Offered) AS ` Quantity_Sold > Quantity_Offered `
FROM Campaigns
WHERE
   Delivery_Date < Start_Date
   OR Quantity_Sold > Quantity_Offered
GROUP BY 1;

Рабочая демонстрация

Объяснение

Логическое выражение в MySQL разрешается в 0 или 1 Таким образом, условие типа Delivery_Date < Start_Date будет преобразовано в 0 или 1. Таким образом, SUM(Delivery_Date < Start_Date) будет преобразовано в SUM(1) или SUM(0).

0 голосов
/ 27 февраля 2020

Попробуйте функцию CASE

SELECT Input_Date, 
   count(CASE WHEN Delivery_Date < Start_Date THEN Campaign_ID END) `Delivery_Date < Start_Date`,
   count(CASE WHEN Sold_Quantity > Offered_Quantity THEN Campaign_ID END) `Sold_Quantity > Offered_Quantity`
FROM Campaigns
GROUP BY Input_Date
0 голосов
/ 27 февраля 2020

Вы также можете использовать условный COUNT, без псевдонима, автоматически сгенерированный заголовок говорит сам за себя.

SELECT
Input_Date,
count(case when Delivery_Date < Start_Date then 1 end) ,
count(case when Quantity_Sold > Quantity_Offered then 1 end) 
FROM Campaigns
WHERE 
Delivery_Date < Start_Date
OR Quantity_Sold > Quantity_Offered
GROUP BY Input_Date;

Input_Date  count(case when Delivery_Date < Start_Date then 1 end)  count(case when Quantity_Sold > Quantity_Offered then 1 end)
2018-02-16                1                                                1
2019-06-20                2                                                1
2019-12-03                1                                                1
...