简体   繁体   中英

SQL: Dynamic Date creation issue

Need Suggestion to make it dynamic On Dates.

Expected: Date, Total Sellers, Sellers From Previous Date

Currently: Data in table(active_seller_codes): date, seller_code

Queries: -- Date Wise Sellers Count

select date,count(distinct seller_code) as Sellers_COunt  
from active_seller_codes where date between '2016-12-15' AND '2016-12-15'

-- Sellers from previous Days

select date,count(distinct seller_code) as Last_Day_Seller  
from active_seller_codes 
where date between '2016-12-15' AND '2016-12-15'
  and seller_code IN(
    select seller_code from active_seller_codes 
    where date between '2016-12-14' AND '2016-12-14'
  )
group by 1

Database Using: Vertica

Reading attentively, you seem to want one row in the report, with the data from the search date in the first two columns and the data of the day before the search date in the third and fourth column, like so:

sales_date|sellers_count|prev_date |prev_sellers_count
2016-12-15|            8|2016-12-14|                 5

The solution could be something like this (without the first Common Table Expression, which, in my case, contains the data, but in your case, the data would be in your active_seller_codes table.

WITH
-- initial input
  (sales_date,seller_code) AS (
          SELECT DATE '2016-12-15',42
UNION ALL SELECT DATE '2016-12-15',43
UNION ALL SELECT DATE '2016-12-15',44
UNION ALL SELECT DATE '2016-12-15',45
UNION ALL SELECT DATE '2016-12-15',46
UNION ALL SELECT DATE '2016-12-15',47
UNION ALL SELECT DATE '2016-12-15',48
UNION ALL SELECT DATE '2016-12-15',49
UNION ALL SELECT DATE '2016-12-14',42
UNION ALL SELECT DATE '2016-12-14',44
UNION ALL SELECT DATE '2016-12-14',46
UNION ALL SELECT DATE '2016-12-14',48
UNION ALL SELECT DATE '2016-12-14',50
UNION ALL SELECT DATE '2016-12-13',42
UNION ALL SELECT DATE '2016-12-13',43
UNION ALL SELECT DATE '2016-12-13',44
UNION ALL SELECT DATE '2016-12-13',45
UNION ALL SELECT DATE '2016-12-13',46
UNION ALL SELECT DATE '2016-12-13',47
UNION ALL SELECT DATE '2016-12-13',48
UNION ALL SELECT DATE '2016-12-13',49
)
,
-- search argument this, in the real query, would come just after the WITH keyword
-- as the above would be the source table
search_dt(search_dt) AS (SELECT DATE '2016-12-15')
,
-- the two days we're interested in, de-duped
distinct_two_days AS (
SELECT DISTINCT
  sales_date
, seller_code
FROM active_seller_codes
WHERE sales_date IN (
    SELECT           search_dt     FROM search_dt -- the search date
    UNION ALL SELECT search_dt - 1 FROM search_dt -- the day before
  )
)
,    
-- the two days we want one above the other,
-- with index for the final pivot
vertical AS (
SELECT
  ROW_NUMBER() OVER (ORDER BY sales_date DESC) AS idx
, sales_date
, count(DISTINCT seller_code) AS seller_count
FROM distinct_two_days
GROUP BY 2
)
SELECT
  MAX(CASE idx WHEN 1 THEN sales_date   END) AS sales_date
, SUM(CASE idx WHEN 1 THEN seller_count END) AS sellers_count
, MAX(CASE idx WHEN 2 THEN sales_date   END) AS prev_date
, SUM(CASE idx WHEN 2 THEN seller_count END) AS prev_sellers_count
FROM vertical
;    


sales_date|sellers_count|prev_date |prev_sellers_count
2016-12-15|            8|2016-12-14|                 5

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM