Solved

MySQL Subquery Nulls

Posted on 2014-04-29
6
304 Views
Last Modified: 2014-04-30
The query below works except for one column 'Last PR'. For that column it returns 'NULL" when t.UM != 'LS'  There is data in the table (pcacpr) so it should not return null. The column is called on Line 12 and the subquery is on Lines 69-79. I've uploaded a mysql dump with tables and data.

SELECT
CONCAT(s.SCCODE," ",s.SCC_DESC) 'Desc',
t.UM 'UoM',
FORMAT(c.POPU, 0) 'Orig Qty',
IF(t.UM = 'LS', 1, ROUND(c.POUEST, 0)) 'Orig PR',
FORMAT(((c.POPU / c.POUEST) * c.POEST), 0) 'Est Cost',
FORMAT(IF(t.UM = 'LS', c.Cost_JTD, Placed_JTD), 0) 'Placed JTD', 
IF(t.UM = 'LS', 1, FORMAT(Placed_JTD/Hours_JTD, 0)) 'Actual PR',
CONCAT('$', FORMAT(c.Cost_JTD, 0)) 'COST JTD',
CONCAT(FORMAT(IF(t.UM = 'LS', ((c.Cost_JTD/(LS_Updated_Variance + c.POPU)) * 100), ((Placed_JTD/Updated_JTD_Qty) * 100)), 0), '%') 'Pct Comp',
FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), Updated_JTD_Qty), 0) 'Updated JTD Qty',
FORMAT(IF(t.UM = 'LS', 1, Rate_Last), 0) 'Last PR',
IF(t.UM = 'LS' OR t.UM = 'GC', CONCAT('$', FORMAT(SUM(c.POPU/c.POUEST)*c.POEST, 0)), 
   IF(POUEST = 0, 0, CONCAT('$', FORMAT(SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST, 0)))) 'Updated Est Cost',   
CONCAT('$', FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST))), 0)) 'PCAC',
CONCAT('$', FORMAT(IF(t.UM = 'LS', LS_Updated_Variance, (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST)) - SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST), 0)) 'Updated Variance'
FROM ccode c
LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
LEFT JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
LEFT JOIN job j ON c.JOB_ID = j.JOB_ID
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) PLACED, SUM(m.PLACEMENT) Placed_JTD 
   FROM materials m
   JOIN `release` r ON m.RELEASE_ID = r.RELEASE_ID
   JOIN ccode c ON r.CCODE_ID = c.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
   JOIN job j ON m.JOB_ID = j.JOB_ID
   WHERE j.JOB_ID = 7398
   AND m.DATE_PLACE <= '2014-04-20'
   AND m.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query ON SUBSTRING(s.SCCODE,1,5) = sub_query.PLACED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) COST, c.COST_JTD Cost_JTD
   FROM ccode c, sccode s
   WHERE s.SCCODE_ID = c.SCCODE_ID
   AND s.STYPE = 0
   AND c.POPU > 0
   AND c.JOB_ID = 7398 
   AND c.DELETED = 'N'
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query1 ON SUBSTRING(s.SCCODE,1,5) = sub_query1.COST
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) UPDATED, c.POPU + SUM(pq.AMOUNT) Updated_JTD_Qty
   FROM pcacqty pq
   JOIN ccode c ON c.CCODE_ID = pq.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 7398
   AND pq.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query2 ON SUBSTRING(s.SCCODE,1,5) = sub_query2.UPDATED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) HOURS, SUM(l.HOURS) Hours_JTD
   FROM labor l
   LEFT JOIN ccode c ON c.CCODE_ID = l.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = l.JOB_ID
   WHERE l.JOB_ID = 7398
   AND l.DATE_WORK <= '2014-04-20'
   AND l.DELETED = 'N'
   AND s.SCTYPE = s.SCTYPE
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query3 ON SUBSTRING(s.SCCODE,1,5) = sub_query3.HOURS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) LS, SUM(ls.LUMPSUM) LS_Updated_Variance
   FROM pcacls ls
   JOIN ccode c ON c.CCODE_ID = ls.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 7398
   AND ls.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query4 ON SUBSTRING(s.SCCODE,1,5) = sub_query4.LS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) RATE, pr.RATE Rate_Last
   FROM pcacpr pr
   LEFT JOIN ccode c ON c.CCODE_ID = pr.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = c.JOB_ID
   AND pr.DELETED = 'N'
   AND pr.TIMESTAMP <= '2014-04-20'
   AND j.JOB_ID = 7398
   GROUP BY SUBSTRING(s.SCCODE,1,5)
   ORDER BY pr.PCACPR_ID DESC
   LIMIT 1) sub_query5 ON SUBSTRING(s.SCCODE,1,5) = sub_query5.RATE
WHERE j.JOB_ID = 7398
AND c.DELETED = 'N'
AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)
ORDER BY s.SCTYPE, s.SCCODE;

Open in new window

jds-s-0427.sql
0
Comment
Question by:hdcowboyaz
  • 2
  • 2
6 Comments
 
LVL 24

Expert Comment

by:chaau
ID: 40031270
You have not uploaded your pcacpr table
0
 
LVL 40

Expert Comment

by:Sharath
ID: 40031307
Display t.UM,Rate_Last data in SELECT clause and check if what results it is returing. Check if t.UM is LS or not.
SELECT
CONCAT(s.SCCODE," ",s.SCC_DESC) 'Desc',
t.UM 'UoM',
FORMAT(c.POPU, 0) 'Orig Qty',
IF(t.UM = 'LS', 1, ROUND(c.POUEST, 0)) 'Orig PR',
FORMAT(((c.POPU / c.POUEST) * c.POEST), 0) 'Est Cost',
FORMAT(IF(t.UM = 'LS', c.Cost_JTD, Placed_JTD), 0) 'Placed JTD', 
IF(t.UM = 'LS', 1, FORMAT(Placed_JTD/Hours_JTD, 0)) 'Actual PR',
CONCAT('$', FORMAT(c.Cost_JTD, 0)) 'COST JTD',
CONCAT(FORMAT(IF(t.UM = 'LS', ((c.Cost_JTD/(LS_Updated_Variance + c.POPU)) * 100), ((Placed_JTD/Updated_JTD_Qty) * 100)), 0), '%') 'Pct Comp',
FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), Updated_JTD_Qty), 0) 'Updated JTD Qty',
FORMAT(IF(t.UM = 'LS', 1, Rate_Last), 0) 'Last PR',
IF(t.UM = 'LS' OR t.UM = 'GC', CONCAT('$', FORMAT(SUM(c.POPU/c.POUEST)*c.POEST, 0)), 
   IF(POUEST = 0, 0, CONCAT('$', FORMAT(SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST, 0)))) 'Updated Est Cost',   
CONCAT('$', FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST))), 0)) 'PCAC',
CONCAT('$', FORMAT(IF(t.UM = 'LS', LS_Updated_Variance, (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST)) - SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST), 0)) 'Updated Variance'
,t.UM,Rate_Last
FROM ccode c
LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
LEFT JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
LEFT JOIN job j ON c.JOB_ID = j.JOB_ID
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) PLACED, SUM(m.PLACEMENT) Placed_JTD 
   FROM materials m
   JOIN `release` r ON m.RELEASE_ID = r.RELEASE_ID
   JOIN ccode c ON r.CCODE_ID = c.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
   JOIN job j ON m.JOB_ID = j.JOB_ID
   WHERE j.JOB_ID = 7398
   AND m.DATE_PLACE <= '2014-04-20'
   AND m.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query ON SUBSTRING(s.SCCODE,1,5) = sub_query.PLACED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) COST, c.COST_JTD Cost_JTD
   FROM ccode c, sccode s
   WHERE s.SCCODE_ID = c.SCCODE_ID
   AND s.STYPE = 0
   AND c.POPU > 0
   AND c.JOB_ID = 7398 
   AND c.DELETED = 'N'
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query1 ON SUBSTRING(s.SCCODE,1,5) = sub_query1.COST
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) UPDATED, c.POPU + SUM(pq.AMOUNT) Updated_JTD_Qty
   FROM pcacqty pq
   JOIN ccode c ON c.CCODE_ID = pq.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 7398
   AND pq.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query2 ON SUBSTRING(s.SCCODE,1,5) = sub_query2.UPDATED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) HOURS, SUM(l.HOURS) Hours_JTD
   FROM labor l
   LEFT JOIN ccode c ON c.CCODE_ID = l.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = l.JOB_ID
   WHERE l.JOB_ID = 7398
   AND l.DATE_WORK <= '2014-04-20'
   AND l.DELETED = 'N'
   AND s.SCTYPE = s.SCTYPE
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query3 ON SUBSTRING(s.SCCODE,1,5) = sub_query3.HOURS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) LS, SUM(ls.LUMPSUM) LS_Updated_Variance
   FROM pcacls ls
   JOIN ccode c ON c.CCODE_ID = ls.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 7398
   AND ls.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query4 ON SUBSTRING(s.SCCODE,1,5) = sub_query4.LS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) RATE, pr.RATE Rate_Last
   FROM pcacpr pr
   LEFT JOIN ccode c ON c.CCODE_ID = pr.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = c.JOB_ID
   AND pr.DELETED = 'N'
   AND pr.TIMESTAMP <= '2014-04-20'
   AND j.JOB_ID = 7398
   GROUP BY SUBSTRING(s.SCCODE,1,5)
   ORDER BY pr.PCACPR_ID DESC
   LIMIT 1) sub_query5 ON SUBSTRING(s.SCCODE,1,5) = sub_query5.RATE
WHERE j.JOB_ID = 7398
AND c.DELETED = 'N'
AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)
ORDER BY s.SCTYPE, s.SCCODE;

Open in new window

0
 

Author Comment

by:hdcowboyaz
ID: 40031314
Actually, 3 tables had to be added; pcacls, pcacqty & pcacpr They are now attached as a MySQL dump.

Use this query as the job, JOB_ID = 6746 has pcacpr data.

SELECT
CONCAT(s.SCCODE," ",s.SCC_DESC) 'Desc',
t.UM 'UoM',
FORMAT(c.POPU, 0) 'Orig Qty',
IF(t.UM = 'LS', 1, ROUND(c.POUEST, 0)) 'Orig PR',
FORMAT(((c.POPU / c.POUEST) * c.POEST), 0) 'Est Cost',
FORMAT(IF(t.UM = 'LS', c.Cost_JTD, Placed_JTD), 0) 'Placed JTD', 
IF(t.UM = 'LS', 1, FORMAT(Placed_JTD/Hours_JTD, 0)) 'Actual PR',
CONCAT('$', FORMAT(c.Cost_JTD, 0)) 'COST JTD',
CONCAT(FORMAT(IF(t.UM = 'LS', ((c.Cost_JTD/(LS_Updated_Variance + c.POPU)) * 100), ((Placed_JTD/Updated_JTD_Qty) * 100)), 0), '%') 'Pct Comp',
FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), Updated_JTD_Qty), 0) 'Updated JTD Qty',
FORMAT(IF(t.UM = 'LS', 1, Rate_Last), 0) 'Last PR',
IF(t.UM = 'LS' OR t.UM = 'GC', CONCAT('$', FORMAT(SUM(c.POPU/c.POUEST)*c.POEST, 0)), 
   IF(POUEST = 0, 0, CONCAT('$', FORMAT(SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST, 0)))) 'Updated Est Cost',   
CONCAT('$', FORMAT(IF(t.UM = 'LS', (LS_Updated_Variance + c.POPU), (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST))), 0)) 'PCAC',
CONCAT('$', FORMAT(IF(t.UM = 'LS', LS_Updated_Variance, (c.Cost_JTD + c.POEST * ((Updated_JTD_Qty-Placed_JTD)/c.POUEST)) - SUM((Updated_JTD_Qty)/c.POUEST)*c.POEST), 0)) 'Updated Variance'
FROM ccode c
LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
LEFT JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
LEFT JOIN job j ON c.JOB_ID = j.JOB_ID
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) PLACED, SUM(m.PLACEMENT) Placed_JTD 
   FROM materials m
   JOIN `release` r ON m.RELEASE_ID = r.RELEASE_ID
   JOIN ccode c ON r.CCODE_ID = c.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN sctype t ON s.SCTYPE = t.SCTYPE_ID
   JOIN job j ON m.JOB_ID = j.JOB_ID
   WHERE j.JOB_ID = 6746
   AND m.DATE_PLACE <= '2014-04-20'
   AND m.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query ON SUBSTRING(s.SCCODE,1,5) = sub_query.PLACED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) COST, c.COST_JTD Cost_JTD
   FROM ccode c, sccode s
   WHERE s.SCCODE_ID = c.SCCODE_ID
   AND s.STYPE = 0
   AND c.POPU > 0
   AND c.JOB_ID = 6746 
   AND c.DELETED = 'N'
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query1 ON SUBSTRING(s.SCCODE,1,5) = sub_query1.COST
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) UPDATED, c.POPU + SUM(pq.AMOUNT) Updated_JTD_Qty
   FROM pcacqty pq
   JOIN ccode c ON c.CCODE_ID = pq.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 6746
   AND pq.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query2 ON SUBSTRING(s.SCCODE,1,5) = sub_query2.UPDATED
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) HOURS, SUM(l.HOURS) Hours_JTD
   FROM labor l
   LEFT JOIN ccode c ON c.CCODE_ID = l.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = l.JOB_ID
   WHERE l.JOB_ID = 6746
   AND l.DATE_WORK <= '2014-04-20'
   AND l.DELETED = 'N'
   AND s.SCTYPE = s.SCTYPE
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query3 ON SUBSTRING(s.SCCODE,1,5) = sub_query3.HOURS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) LS, SUM(ls.LUMPSUM) LS_Updated_Variance
   FROM pcacls ls
   JOIN ccode c ON c.CCODE_ID = ls.CCODE_ID
   JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   JOIN job j ON j.JOB_ID = c.JOB_ID
   AND j.JOB_ID = 6746
   AND ls.DELETED = 'N'
   AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)) sub_query4 ON SUBSTRING(s.SCCODE,1,5) = sub_query4.LS
LEFT JOIN (SELECT SUBSTRING(s.SCCODE,1,5) RATE, pr.RATE Rate_Last
   FROM pcacpr pr
   LEFT JOIN ccode c ON c.CCODE_ID = pr.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = c.JOB_ID
   AND pr.DELETED = 'N'
   AND pr.TIMESTAMP <= '2014-04-20'
   AND j.JOB_ID = 6746
   GROUP BY SUBSTRING(s.SCCODE,1,5)
   ORDER BY pr.PCACPR_ID DESC
   LIMIT 1) sub_query5 ON SUBSTRING(s.SCCODE,1,5) = sub_query5.RATE
WHERE j.JOB_ID = 6746
AND c.DELETED = 'N'
AND c.POPU > 0
GROUP BY SUBSTRING(s.SCCODE,1,5)
ORDER BY s.SCTYPE, s.SCCODE;

Open in new window

pcac-0429.sql
0
 
LVL 24

Accepted Solution

by:
chaau earned 500 total points
ID: 40031342
I see what you are trying to do. You are trying to retrieve the latest Rate from your pcacpr table for each of SCCCODE. You are using an incorrect technique. By using LIMIT 1 you will restrict the sub_query5 to one record, and it may not be the one that is "current" in the main query. Instead, I recommend changing the sub_query5 to this:

   SELECT SUBSTRING(s.SCCODE,1,5) RATE, pr.RATE Rate_Last
   FROM pcacpr pr
   LEFT JOIN ccode c ON c.CCODE_ID = pr.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID
   LEFT JOIN job j ON j.JOB_ID = c.JOB_ID
   LEFT JOIN
     ( SELECT SUBSTRING(s.SCCODE,1,5) RATE, MAX(PCACPR_ID) Last_PCACPR_ID
   FROM pcacpr pr LEFT JOIN ccode c ON c.CCODE_ID = pr.CCODE_ID
   LEFT JOIN sccode s ON s.SCCODE_ID = c.SCCODE_ID AND pr.DELETED = 'N'
   AND pr.TIMESTAMP <= '2014-04-20'
  GROUP BY SUBSTRING(s.SCCODE,1,5)) Last_pr ON SUBSTRING(s.SCCODE,1,5) = Last_pr.RATE AND pr.PCACPR_ID = Last_pr.Last_PCACPR_ID
   AND j.JOB_ID = 6746
   GROUP BY SUBSTRING(s.SCCODE,1,5)

Open in new window


Replace the statement above as your sub_query5 and see if it makes any difference
0
 

Author Closing Comment

by:hdcowboyaz
ID: 40031401
Thanks
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Foreword In the years since this article was written, numerous hacking attacks have targeted password-protected web sites.  The storage of client passwords has become a subject of much discussion, some of it useful and some of it misguided.  Of cou…
Confronted with some SQL you don't know can be a daunting task. It can be even more daunting if that SQL carries some of the old secret codes used in the Ye Olde query syntax, such as: (+)     as used in Oracle;     *=     =*    as used in Sybase …
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

823 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question