Skip to content

Commit afe17e6

Browse files
Merge pull request #60 from Ritik574-coder/dbt_branch
Implement inventory snapshot cleaning and derived inventory value calculation
2 parents ef07904 + 804d06b commit afe17e6

1 file changed

Lines changed: 270 additions & 73 deletions

File tree

explore_database/inventory/inventory.sql

Lines changed: 270 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
--=============================================================================================
66
--=========================== inventory_snapshots table overview ==============================
77
--=============================================================================================
8-
SELECT TOP (1000) [snapshot_date]
8+
SELECT TOP (1000)
9+
[snapshot_date]
910
,[product_id]
1011
,[product_name]
1112
,[sku]
@@ -396,100 +397,296 @@ FROM bronze.inventory_snapshots ;
396397
--=============================================================================================
397398
--=============================== unit_cost column cleaning ===================================
398399
--=============================================================================================
400+
-- unite_cost data overview
399401
SELECT
400-
unit_cost
401-
FROM bronze.inventory_snapshots
402+
unit_cost
403+
FROM bronze.inventory_snapshots ;
404+
405+
-- unite_cost data profiling
406+
SELECT
407+
unit_cost
408+
FROM bronze.inventory_snapshots
409+
WHERE unit_cost IS NULL
410+
OR TRY_CONVERT(DECIMAL(10, 2), unit_cost) IS NULL ;
411+
412+
-- unit_cost cleaning and standardization
413+
SELECT
414+
CASE
415+
WHEN unit_cost LIKE '$%' THEN SUBSTRING(unit_cost, 2, LEN(unit_cost))
416+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_cost)
417+
END as unit_cost
418+
FROM bronze.inventory_snapshots ;
402419

403420
--=============================================================================================
404421
--================================== unit_price column cleaning ===============================
405422
--=============================================================================================
423+
-- unit_price data overview
406424
SELECT
407-
unit_price
408-
FROM bronze.inventory_snapshots
425+
unit_price
426+
FROM bronze.inventory_snapshots ;
427+
428+
-- selecting those unite price they contani '$' symbol
429+
SELECT
430+
unit_price
431+
FROM bronze.inventory_snapshots
432+
WHERE unit_price LIKE '$%' ;
433+
434+
-- selecting those unite price they contani ',' symbol
435+
SELECT
436+
unit_price
437+
FROM bronze.inventory_snapshots
438+
WHERE unit_price LIKE '%,%' ;
439+
440+
-- finding those unit price they are 0
441+
SELECT
442+
unit_price
443+
FROM bronze.inventory_snapshots
444+
WHERE TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(unit_price, '$', ''), ',', '')) < 1 ;
445+
446+
-- unit_price data profiling
447+
SELECT
448+
unit_price
449+
FROM bronze.inventory_snapshots
450+
WHERE unit_price IS NULL
451+
OR TRY_CONVERT(DECIMAL(10, 2), unit_price) IS NULL
452+
OR unit_price LIKE '$%'
453+
OR unit_price LIKE '%,%' ;
454+
455+
-- unit_price data profiling
456+
SELECT
457+
unit_price
458+
FROM bronze.inventory_snapshots
459+
WHERE unit_price IS NULL
460+
OR TRY_CONVERT(DECIMAL(10, 2), REPLACE(REPLACE(unit_price, ',', ''), '$', '')) IS NULL ;
461+
462+
-- unit_price cleaning and standardization
463+
WITH unit_price_analysis AS
464+
(
465+
SELECT
466+
CASE
467+
WHEN TRY_CONVERT(DECIMAL(10,2), unit_price) IS NULL THEN TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(unit_price, ',', ''), '$', ''))
468+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_price)
469+
END as unit_price
470+
FROM bronze.inventory_snapshots
471+
)
472+
SELECT
473+
unit_price
474+
FROM unit_price_analysis
475+
WHERE unit_price IS NULL ;
409476

410477
--=============================================================================================
411478
--=============================== inventory_value column cleaning ============================
412479
--=============================================================================================
480+
-- inventory_value data overview
413481
SELECT
414-
inventory_value
415-
FROM bronze.inventory_snapshots
482+
inventory_value
483+
FROM bronze.inventory_snapshots ;
416484

417-
--#############################################################################################
418-
--############################## EMPLOYEE CLEAN DATA ##########################################
419-
--#############################################################################################
485+
-- inventory_value data profiling
486+
SELECT
487+
inventory_value
488+
FROM bronze.inventory_snapshots
489+
WHERE inventory_value IS NULL ;
420490

421-
SELECT TOP (1000)
422-
CASE
423-
WHEN snapshot_date LIKE '[A-Z][a-z][a-z][a-z] __, ____' THEN TRY_CONVERT(DATE ,snapshot_date)
424-
WHEN snapshot_date LIKE '[A-Z][a-z][a-z] __, ____' THEN TRY_CONVERT(DATE ,snapshot_date)
425-
WHEN snapshot_date LIKE '____/__/__' THEN TRY_CONVERT(DATE ,snapshot_date)
426-
WHEN snapshot_date LIKE '____-__-__' THEN TRY_CONVERT(DATE ,snapshot_date)
427-
428-
WHEN snapshot_date LIKE '__/__/____' AND SUBSTRING(snapshot_date, 4, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 101)
429-
WHEN snapshot_date LIKE '__/__/____' AND LEFT(snapshot_date, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 103)
430-
WHEN snapshot_date LIKE '__-__-____' AND SUBSTRING(snapshot_date, 4, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 110)
431-
WHEN snapshot_date LIKE '__-__-____' AND LEFT(snapshot_date, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 105)
432-
ELSE TRY_CONVERT(DATE, snapshot_date)
433-
END as snapshot_date
434-
435-
,CASE
436-
WHEN TRY_CONVERT(INT, product_id) IS NULL THEN NULL
437-
ELSE TRY_CONVERT(INT, product_id)
438-
END as product_id
491+
-- inventory_value null count
492+
SELECT
493+
inventory_value
494+
FROM bronze.inventory_snapshots
495+
WHERE inventory_value IS NOT NULL ;
439496

440-
,CASE
441-
WHEN product_name IS NULL OR product_name = '' THEN 'Unknown'
442-
ELSE TRIM(product_name)
443-
END as product_name
497+
-- data prifiling and standardization
498+
WITH calc_inventory_value AS
499+
(
500+
SELECT
501+
CASE
502+
WHEN TRY_CONVERT(INT, stock_on_hand) IS NULL OR stock_on_hand < 0 THEN NULL
503+
ELSE TRY_CONVERT(INT, stock_on_hand)
504+
END AS stock_on_hand
505+
506+
,CASE
507+
WHEN TRY_CONVERT(DECIMAL(10,2), unit_price) IS NULL THEN TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(unit_price, ',', ''), '$', ''))
508+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_price)
509+
END as unit_price
510+
FROM bronze.inventory_snapshots
511+
)
512+
SELECT
513+
COUNT(*) AS total_rows,
514+
COUNT(stock_on_hand) AS valid_stock,
515+
COUNT(unit_price) AS valid_price
516+
FROM calc_inventory_value;
444517

445-
,CASE
446-
WHEN sku IS NULL OR sku = '' THEN 'Unknown'
447-
ELSE TRIM(sku)
448-
END as sku
518+
-- unit_price cleaning and standardization
519+
WITH calc_inventory_value AS
520+
(
521+
SELECT
522+
CASE
523+
WHEN TRY_CONVERT(INT, stock_on_hand) IS NULL OR stock_on_hand < 0 THEN NULL
524+
ELSE TRY_CONVERT(INT, stock_on_hand)
525+
END AS stock_on_hand
526+
527+
,CASE
528+
WHEN TRY_CONVERT(DECIMAL(10,2), unit_price) IS NULL THEN TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(unit_price, ',', ''), '$', ''))
529+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_price)
530+
END as unit_price
531+
FROM bronze.inventory_snapshots
532+
)
533+
SELECT
534+
stock_on_hand * unit_price as inventory_value
535+
FROM calc_inventory_value ;
449536

450-
,CASE
451-
WHEN TRIM(LOWER(category)) = 'electronics' THEN 'Electronics'
452-
WHEN TRIM(LOWER(category)) = 'clothing' THEN 'Clothing'
453-
WHEN TRIM(LOWER(category)) = 'kitchen' THEN 'Kitchen'
454-
WHEN TRIM(LOWER(category)) = 'office' THEN 'Office'
455-
WHEN TRIM(LOWER(category)) = 'sports' THEN 'Sports'
456-
WHEN TRIM(LOWER(category)) = 'health' THEN 'Health'
457-
WHEN TRIM(LOWER(category)) = 'beauty' THEN 'Beauty'
458-
WHEN TRIM(LOWER(category)) = 'footwear' THEN 'Footwear'
459-
WHEN TRIM(LOWER(category)) = 'toys' THEN 'Toys'
460-
WHEN TRIM(LOWER(category)) = 'bags' THEN 'Bags'
461-
ELSE 'Unknown'
462-
END AS category
463-
464-
,CASE
465-
WHEN TRY_CONVERT(INT, stock_on_hand) IS NULL OR stock_on_hand < 0 THEN NULL
466-
ELSE TRY_CONVERT(INT, stock_on_hand)
467-
END AS stock_on_hand
537+
--=============================================================================================
538+
--=============================== warehouse_location column cleaning =========================
539+
--=============================================================================================
540+
-- warehouse_location data overview
541+
SELECT
542+
warehouse_location
543+
FROM bronze.inventory_snapshots ;
468544

469-
,CASE
470-
WHEN stock_reserved < 0 OR TRY_CONVERT(INT, stock_reserved) IS NULL THEN NULL
471-
ELSE TRY_CONVERT(INT, stock_reserved)
472-
END as stock_reserved
545+
-- warehouse_location unique data overview
546+
SELECT DISTINCT
547+
warehouse_location
548+
FROM bronze.inventory_snapshots ;
473549

474-
,CASE
475-
WHEN stock_available IS NULL THEN stock_on_hand - stock_reserved
476-
WHEN TRY_CONVERT(INT, stock_available) IS NULL THEN NULL
477-
ELSE TRY_CONVERT(INT, stock_available)
478-
END as stock_available
550+
-- warehouse_location case-sensitive data profiling
551+
SELECT DISTINCT
552+
UPPER(warehouse_location) COLLATE Latin1_General_CS_AS as warehouse_location
553+
FROM bronze.inventory_snapshots ;
479554

480-
,CASE
481-
WHEN reorder_level IS NULL OR reorder_level < 0 OR TRY_CONVERT(INT, reorder_level) IS NULL THEN NULL
482-
ELSE TRY_CONVERT(INT, reorder_level)
483-
END as reorder_level
555+
-- warehouse_location data profiling and standardization
556+
SELECT
557+
CASE
558+
WHEN warehouse_location IS NULL OR warehouse_location = '' THEN 'Unknown'
559+
ELSE UPPER(warehouse_location)
560+
END as warehouse_location
561+
FROM bronze.inventory_snapshots ;
484562

485-
,[unit_cost]
563+
--=============================================================================================
564+
--================================= store_id column cleaning =================================
565+
--=============================================================================================
566+
-- store_id data overview
567+
SELECT
568+
store_id
569+
FROM bronze.inventory_snapshots ;
486570

487-
,[unit_price]
571+
-- store_id data profiling
572+
SELECT
573+
store_id
574+
FROM bronze.inventory_snapshots
575+
WHERE store_id IS NULL OR store_id = ''
576+
OR TRY_CONVERT(INT, store_id) IS NULL ;
488577

489-
,[inventory_value]
578+
-- store id distribution analysis
579+
SELECT
580+
store_id,
581+
COUNT(*) store_id_count,
582+
CAST(ROUND(COUNT(*)*100.0/SUM(COUNT(*)) OVER(), 2) AS NVARCHAR) + '%' as percentages
583+
FROM bronze.inventory_snapshots
584+
GROUP BY store_id
585+
ORDER BY store_id_count DESC ;
490586

491-
,[warehouse_location]
587+
-- store_id cleaning and standardization
588+
SELECT
589+
CASE
590+
WHEN store_id IS NULL OR store_id = '' THEN NULL
591+
ELSE TRY_CONVERT(INT, store_id)
592+
END as store_id
593+
FROM bronze.inventory_snapshots ;
492594

493-
,[store_id]
595+
--#############################################################################################
596+
--############################## EMPLOYEE CLEAN DATA ##########################################
597+
--#############################################################################################
598+
599+
SELECT
600+
snapshot_date
601+
,product_id
602+
,product_name
603+
,sku
604+
,category
605+
,stock_on_hand
606+
,stock_reserved
607+
,stock_on_hand - stock_reserved as stock_available
608+
,reorder_level
609+
,unit_cost
610+
,unit_price
611+
,unit_price * stock_on_hand as inventory_value
612+
,warehouse_location
613+
,store_id
614+
FROM
615+
(
616+
SELECT
617+
CASE
618+
WHEN snapshot_date LIKE '[A-Z][a-z][a-z][a-z] __, ____' THEN TRY_CONVERT(DATE ,snapshot_date)
619+
WHEN snapshot_date LIKE '[A-Z][a-z][a-z] __, ____' THEN TRY_CONVERT(DATE ,snapshot_date)
620+
WHEN snapshot_date LIKE '____/__/__' THEN TRY_CONVERT(DATE ,snapshot_date)
621+
WHEN snapshot_date LIKE '____-__-__' THEN TRY_CONVERT(DATE ,snapshot_date)
622+
623+
WHEN snapshot_date LIKE '__/__/____' AND SUBSTRING(snapshot_date, 4, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 101)
624+
WHEN snapshot_date LIKE '__/__/____' AND LEFT(snapshot_date, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 103)
625+
WHEN snapshot_date LIKE '__-__-____' AND SUBSTRING(snapshot_date, 4, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 110)
626+
WHEN snapshot_date LIKE '__-__-____' AND LEFT(snapshot_date, 2) > 12 THEN TRY_CONVERT(DATE, snapshot_date, 105)
627+
ELSE TRY_CONVERT(DATE, snapshot_date)
628+
END as snapshot_date
629+
630+
,CASE
631+
WHEN TRY_CONVERT(INT, product_id) IS NULL THEN NULL
632+
ELSE TRY_CONVERT(INT, product_id)
633+
END as product_id
634+
635+
,CASE
636+
WHEN product_name IS NULL OR product_name = '' THEN 'Unknown'
637+
ELSE TRIM(product_name)
638+
END as product_name
639+
640+
,CASE
641+
WHEN sku IS NULL OR sku = '' THEN 'Unknown'
642+
ELSE TRIM(sku)
643+
END as sku
494644

495-
FROM [bronze].[inventory_snapshots]
645+
,CASE
646+
WHEN TRIM(LOWER(category)) = 'electronics' THEN 'Electronics'
647+
WHEN TRIM(LOWER(category)) = 'clothing' THEN 'Clothing'
648+
WHEN TRIM(LOWER(category)) = 'kitchen' THEN 'Kitchen'
649+
WHEN TRIM(LOWER(category)) = 'office' THEN 'Office'
650+
WHEN TRIM(LOWER(category)) = 'sports' THEN 'Sports'
651+
WHEN TRIM(LOWER(category)) = 'health' THEN 'Health'
652+
WHEN TRIM(LOWER(category)) = 'beauty' THEN 'Beauty'
653+
WHEN TRIM(LOWER(category)) = 'footwear' THEN 'Footwear'
654+
WHEN TRIM(LOWER(category)) = 'toys' THEN 'Toys'
655+
WHEN TRIM(LOWER(category)) = 'bags' THEN 'Bags'
656+
ELSE 'Unknown'
657+
END AS category
658+
659+
,CASE
660+
WHEN TRY_CONVERT(INT, stock_on_hand) IS NULL OR stock_on_hand < 0 THEN NULL
661+
ELSE TRY_CONVERT(INT, stock_on_hand)
662+
END AS stock_on_hand
663+
664+
,CASE
665+
WHEN stock_reserved < 0 OR TRY_CONVERT(INT, stock_reserved) IS NULL THEN NULL
666+
ELSE TRY_CONVERT(INT, stock_reserved)
667+
END as stock_reserved
668+
669+
,CASE
670+
WHEN reorder_level IS NULL OR reorder_level < 0 OR TRY_CONVERT(INT, reorder_level) IS NULL THEN NULL
671+
ELSE TRY_CONVERT(INT, reorder_level)
672+
END as reorder_level
673+
674+
,CASE
675+
WHEN unit_cost LIKE '$%' THEN TRY_CONVERT(DECIMAL(10, 2), SUBSTRING(unit_cost, 2, LEN(unit_cost)))
676+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_cost)
677+
END as unit_cost
678+
679+
,CASE
680+
WHEN TRY_CONVERT(DECIMAL(10,2), unit_price) IS NULL THEN TRY_CONVERT(DECIMAL(10,2), REPLACE(REPLACE(unit_price, ',', ''), '$', ''))
681+
ELSE TRY_CONVERT(DECIMAL(10, 2), unit_price)
682+
END as unit_price
683+
684+
,CASE
685+
WHEN warehouse_location IS NULL OR warehouse_location = '' THEN 'Unknown'
686+
ELSE UPPER(warehouse_location)
687+
END as warehouse_location
688+
689+
,[store_id]
690+
691+
FROM [bronze].[inventory_snapshots]
692+
)t;

0 commit comments

Comments
 (0)