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
399401SELECT
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
406424SELECT
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
413481SELECT
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