Ссылка на столбец SQL, сгенерированный из SELECT - PullRequest
0 голосов
/ 09 ноября 2019

В моем SQL я пытаюсь понять, больше ли мой оператор select (столбцы) больше нуля. Если так, то верните запись, если нет, то она не будет включена в результаты. вот мой код:

SELECT 
  a.securityID, 
  username, 
  a.dateOn, 
  (SELECT SUM(pricePaid*qty) as total FROM auctions_cart c INNER JOIN auctions_orders o ON o.orderID=c.orderID WHERE o.securityID=a.securityID AND c.status='closed' AND o.dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND o.dateOn>='7/2/2013 9:16:15 AM') as aTotal, 
  (SELECT SUM(price*qty) as total FROM donations_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM' AND rDenied<>'True') as dTotal, 
  (SELECT SUM(price*qty) as total FROM events_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM') as eTotal, 
  (SELECT SUM(price*qty) as total FROM registrations_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM') as rTotal

FROM authorizeNet a 

INNER JOIN security s ON s.securityID=a.securityID 

WHERE 
  (a.dateOn is not null) AND
  (aTotal>0 OR eTotal>0 OR rTotal>0 or dTotal>0)

Примечания ... 3-6 столбцов - это операторы SELECT, которые фильтруют на основе a.securityID в нулевом столбце. В конце (SELECT ...) я пытаюсь сказать как aTotal, а затем сослаться на это в предложении WHERE. Это не работает.

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Это должно работать.

WITH cte AS (
    SELECT a.securityID, username, a.dateOn
    FROM authorizeNet a 
    INNER JOIN security s ON s.securityID=a.securityID 
    WHERE a.dateOn IS NOT NULL
)
SELECT cte.*, a.total AS aTotal, d.total AS dTotal, e.total AS eTotal, r.total AS rTotal
FROM cte 
CROSS APPLY (
    SELECT SUM(pricePaid*qty) as total 
    FROM auctions_cart c 
    INNER JOIN auctions_orders o ON o.orderID=c.orderID 
    WHERE o.securityID = cte.securityID 
        AND c.status='closed' 
        AND o.dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' 
        AND o.dateOn>='7/2/2013 9:16:15 AM'
) a
CROSS APPLY (
    SELECT SUM(price*qty) as total 
    FROM donations_cart 
    WHERE securityID = cte.securityID 
        AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' 
        AND dateOn>='7/2/2013 9:16:15 AM' 
        AND rDenied<>'True'
) d
CROSS APPLY (
    SELECT SUM(price*qty) as total 
    FROM events_cart 
    WHERE securityID = cte.securityID 
        AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' 
        AND dateOn>='7/2/2013 9:16:15 AM'
) e
CROSS APPLY (
    SELECT SUM(price*qty) as total 
    FROM registrations_cart 
    WHERE securityID = cte.securityID 
        AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' 
        AND dateOn>='7/2/2013 9:16:15 AM'
) r
WHERE a.total > 0 OR e.total > 0 OR r.total > 0 or d.total > 0
1 голос
/ 09 ноября 2019

Нельзя ссылаться на псевдонимы из агрегированных столбцов в предложении WHERE. Если вы хотите сохранить свой запрос, то вы можете сделать следующий код:

SELECT * FROM (
    SELECT a.securityID, username, a.dateOn, 
    (SELECT SUM(pricePaid*qty) as total FROM auctions_cart c INNER JOIN auctions_orders o ON o.orderID=c.orderID WHERE o.securityID=a.securityID AND c.status='closed' AND o.dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND o.dateOn>='7/2/2013 9:16:15 AM') as aTotal, 
    (SELECT SUM(price*qty) as total FROM donations_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM' AND rDenied<>'True') as dTotal, 
    (SELECT SUM(price*qty) as total FROM events_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM') as eTotal, 
    (SELECT SUM(price*qty) as total FROM registrations_cart WHERE securityID=a.securityID AND dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND dateOn>='7/2/2013 9:16:15 AM') as rTotal
    FROM authorizeNet a 
    INNER JOIN security s ON s.securityID=a.securityID 
    ) B       
WHERE (a.dateOn is not null) AND (aTotal>0 OR eTotal>0 OR rTotal>0 or dTotal>0)

Для этого есть более элегантное решение, но я оставлю это на ваше усмотрение, чтобы определить.

0 голосов
/ 09 ноября 2019

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

Так что, если у вас есть aTotal>0, его нужно изменить на

(
    SELECT SUM(pricePaid*qty) as total
    FROM auctions_cart c
    INNER JOIN auctions_orders o ON o.orderID=c.orderID
    WHERE o.securityID=a.securityID AND c.status='closed' AND o.dateOn between '11/1/2019 00:01:00.00' AND '11/30/2019 23:59:59.999' AND o.dateOn>='7/2/2013 9:16:15 AM'
) > 0
...