Count number of times value appears in column in MySQL - mysql

Tried looking everywhere for this but my searching hasn't given me any answers.
Looking to count how many times the word 'Sydney' comes up in the column 'Suburb'
CustomerId FirstName LastName StreetAddress Suburb PostCode
C001 James Smith 400 Kent St Sydney 2000
C002 Maria Carpenter 333 Smith St Westmead 2145
C003 Dennis Miller 214 Uni Rd Sydney 2000
I want it to provide an outcome like:
numCustomersFromSydney
2

Use this simple query:
select count(*) as numCustomersFromSydney from table where Suburb = "Sydney";

Use COUNT() and an alias name:
SELECT
COUNT(Suburb) AS numCustomersFromSydney
FROM
yourtable
WHERE
Suburb = 'Sydney'

Related

Assign correct Responsible person from JSON format column based on Service Date

P.S. previous post was deleted, I hope this time it will reach more people.
I have huge history dataset and I need to assign value (ResponsibleName - from JSON format column) to a new 'Responsible' column based on Service Date for all rows associate with Client.
Each Client can have unique Responsible person (JSON column) for the specific date range:
If Codes Column contains Supervisor, then assign this Employee to only associated row as Responsible.
And finally, if Codes Column contains Employee, than assign associated Responsible person from the JSON column (for specific date range) to Responsible
I don't have issues with the first step, however I can't find a solution to implement the 2nd (last) statement.
Original History Table Joined with Client Table:
SELECT h.Id,
h.ServiceDate
h.ClientId,
cl.ClientName,
h.EmployeeName,
cl.ResponsibleJSON,
h.Codes
FROM History AS h
JOIN ClientTable AS cl
ON (h.ClientId = cl.ClientId)
Output of that table:
Id
ServiceDate
ClientId
ClientName
EmployeeName
ResponsibleJSON
Codes
1
2020-05-06
123
John Smith
Chris Evans
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Employee, Office
2
2020-05-08
123
John Smith
Tom Holland
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Supervisor, Remote
3
2020-05-11
123
John Smith
Chris Evans
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Employee, Office
4
2020-05-15
123
John Smith
Thomas Anderson
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Employee, Office
5
2020-06-10
123
John Smith
Tom Holland
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Supervisor, Office
6
2020-06-17
123
John Smith
Thomas Anderson
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Employee, Remote
7
2020-06-22
123
John Smith
Elon Mask
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Employee, Remote
8
2020-07-01
123
John Smith
Tom Holland
[{"ResponsibleName":"Kevin Costner","ResponsibleStartDate":"2019-02-14","ResponsibleEndDate":"2020-05-31"},{"ResponsibleName":"Tom Cruise", "ResponsibleStartDate":"2020-06-01","ResponsibleEndDate":null}]
Supervisor, Remote
I've created the table with all JSON data for all Clients:
SELECT c.ClientId,
c.ClientFullName,
c.ResponsibleJSON,
JSON_VALUE(X.VALUE,'$.ResponsibleName') AS ResponsibleName,
JSON_VALUE(X.VALUE,'$.ResponsibleStartDate') AS ResponsibleStartDate,
ISNULL(JSON_VALUE(X.VALUE,'$.ResponsibleEndDate'), '2999-12-31') AS ResponsibleEndDate
FROM ClientTable AS c
CROSS APPLY OPENJSON(c.ResponsibleJSON) AS X
ORDER BY c.ClientFullName, ResponsibleStartDate
And now I need to combine them somehow to produce column below:
Desired Output:
Responsible
Kevin Costner
Tom Holland
Kevin Costner
Kevin Costner
Tom Holland
Tom Cruise
Tom Cruise
Tom Holland
Code I need help with you can find below.
I don't know if I can OUTER APPLY in CASE statement AND I think JOIN should be ON ClientId and check if ServiceDate between ResponsibleStartDate AND ResponsibleEndDate.
SELECT h.Id,
h.ServiceDate
h.ClientId,
cl.ClientName,
h.EmployeeName,
cl.ResponsibleJSON,
h.Codes,
CASE
WHEN h.Codes LIKE '%Supervisor%' THEN h.EmployeeName --- 1st statement
WHEN --- here should be the second statement. I don't know how to implement it.
END AS Responsible
FROM History AS h
JOIN ClientTable AS cl
ON (h.ClientId = cl.ClientId)
It seems you only want to lookup the JSON when the Codes column does not contain Supervisor. The following query should do what you want:
SELECT
c.Id,
c.ServiceDate,
c.ClientId,
c.ClientName,
c.EmployeeName,
c.Codes,
Supervisor =
CASE WHEN c.Codes LIKE '%Supervisor%' THEN c.EmployeeName
ELSE (
SELECT TOP (1)
j.ResponsibleName
FROM OPENJSON(c.ResponsibleJSON)
WITH (
ResponsibleName nvarchar(100),
ResponsibleStartDate date,
ResponsibleEndDate date
) j
WHERE c.ServiceDate >= j.ResponsibleStartDate
AND (j.ResponsibleEndDate IS NULL OR c.ServiceDate <= j.ResponsibleEndDate)
)
END
FROM ClientTable c;
db<>fiddle

How to find the Employee names and their supervisor names if the table doesn't have common numeric column like Employee_id or employee number in Mysql

If the table have only two columns with employee name and their supervisor column and if it doesn't have any other numeric or number column with employee_number or employee_id, then how the results can be produced. I'm not getting logic to show the results.
Code for creating table in Mysql:
CREATE TABLE DATABASE_TABLE
(
Employee_Name nvarchar(255) PRIMARY KEY,
Supervisor_Name nvarchar(255) NOT NULL
);
CREATE INDEX ix_database_table_supervisor
ON DATABASE_TABLE (Supervisor_Name);
INSERT INTO DATABASE_TABLE
(Employee_Name, Supervisor_Name) VALUES
('Alice','Dave'), ('Olive','Dave'), ('Barton','Dave')
, ('Almira','Jacob'), ('Charles','Jacob'), ('Davis','Jacob')
, ('Robert','Risha'), ('Peter','Risha'), ('Ethel','Risha')
, ('Isaac','Jospeh'), ('Sophia','Jospeh'), ('Rosa','Jospeh')
, ('Joshua','Dandy'), ('Silas','Dandy'), ('Fred','Dandy')
, ('Frank','Andrew'), ('Howard','Andrew'), ('Ralph','Andrew')
, ('Dennis','Henry'), ('Alex','Henry'), ('Floyd','Henry')
, ('Carlos','Nelson'), ('Homer','Nelson'), ('Harold','Nelson')
, ('Leo','Simon'), ('Warren','Simon'), ('Clifford','Simon')
, ('Martha','Casper'), ('Hazel','Casper'), ('Irene','Casper')
, ('Dave','Betsy'), ('Jacob','Betsy'), ('Risha','David')
, ('Jospeh','David'), ('Dandy','Phillip'), ('Andrew','Phillip')
, ('Henry','Harvey'), ('Nelson','Harvey'), ('Simon','Paul')
, ('Casper','Paul'), ('Betsy','Joe'), ('David','Joe')
, ('Phillip','Joe'), ('Harvey','Joe'), ('Paul','Joe')
It's output is:
Employee_name Supervisor_name
Frank Andrew
Howard Andrew
Ralph Andrew
Dave Betsy
Jacob Betsy
Hazel Casper
Irene Casper
Martha Casper
Fred Dandy
Joshua Dandy
Silas Dandy
Alice Dave
Barton Dave
Olive Dave
Jospeh David
Risha David
Henry Harvey
Nelson Harvey
Alex Henry
Dennis Henry
Floyd Henry
Almira Jacob
Charles Jacob
Davis Jacob
Betsy Joe
David Joe
....
The result should be in the lower to higher level of hierarchy like:
Employee_Name Supervisor_Name Higher_Supervisor Next_higher_Supervisor
Frank Andrew Phillip Joe
Howard Andrew Phillip Joe
Ralph Andrew Phillip Joe
Dave Betsy Joe no_supervisor
Jacob Betsy Joe no_supervisor
Hazel Casper Paul Joe
Irene Casper Paul Joe
Martha Casper Paul Joe
For Eg: Frank's supervisor is Andrew, Andrew's supervisor is Phillip, Phillip's supervisor is Joe
For Eg: Dave's supervisor is Betsy, Betsy's supervisor is Joe, and Joe doesn't have any supervisor so no_supervisor should be displayed.
For Eg: Hazel's supervisor is Casper, Casper's supervisor's is Paul, and Paul's Supervisor is Joe should be displayed in the order format
For this particular set of data, it can LEFT JOIN the table itself to get the expected results
SELECT a.Employee_Name, a.Supervisor_Name, b.Supervisor_Name, c.Supervisor_Name
FROM DATABASE_TABLE a
LEFT JOIN DATABASE_TABLE b ON a.Supervisor_Name = b.Employee_Name
LEFT JOIN DATABASE_TABLE c ON b.Supervisor_Name = c.Employee_Name
If hierarchy depth is unknown, which means the number of columns is unknown, it's more complicated. It is still possible by using recursive CTE to find the depth and generate dynamic SQL.

Passing Multiple ids to single parameter in mysql

I have table emloyee with following data.
Id Name Country
1 John USA
2 Smith USA
3 Jack IND
4 Lory UK
5 Miller USA
I want to get result by calling stored procedure like this
call getEmployeeDetailsByCountry('IND,UK');
Result:
Id Name Country
3 Jack IND
4 Lory UK
My Procedure is
select * from employee
where if( (LOCATE(',','IND,USD')>0),
Country in (concat('\'',REPLACE('IND,USD', ',', '\',\''),'\''))
, Country in ('IND,USD'));
Here it replaces 'IND,USD' to 'IND','USD'.
But result is no rows.... Can anyone help me to find..... thank you
Use FIND_IN_SET instead of IN
SELECT *
FROM product
WHERE FIND_IN_SET(country, 'IND,USD');
Try this i think this will solve your problem
Why dont you use a query with a simple IN statement in the where clause?
SELECT * FROM employee WHERE Country IN ('IND', 'UK');

SQL select non null value

Customer_name Customer_street Customer_city
Lucy Spring Pittsfield
Lucy Spring Pittsfield
Brooks Senator Brooklyn
James North Rye
Vicky Sand Hill Woodside
Lutz 3399 Rice St null
I am practicing on some command of mysql. I have a customer table above. I want to list customer city names from that table but list only those non-null city names. I tried
select customer_city
from customer
WHERE customer_city IS NOT NULL;
The result still list the null city. Am I missing something? Thank you for your help;

SQL SELECT FROM WHERE FirstName > "Maria"

I have the following table:
First Name
Bryce
Marcellin
Caroline
Kerry
Roberto
Mary
Carol
Warren
Bonnie
Terry
Louis
Michelle
Bobby
Tony
Vic
Frank
Roberto
Jose
Doug
Brian
William
Aiden
Davis
What exactly does SELECT FirstName FROM Members WHERE FirstName > "Maria"; search for ? in particular, the WHERE statement.
It returns the names:
Roberto, Mary, Warren, Terry, Michelle, Tony, Vic, Roberto and William
I thought it was searching for FirstName strings that are longer than 5 characters but this is not the case since Tony and Vic are also returned.
It searches for terms that are in alphabetical order AFTER "Maria."
For example, with "Jack, James, Jim" if you searched for SELECT name FROM table WHERE first_name >= 'James' you would receive the results of 'James' and 'Jim', since alphabetically those two are after one another. The reason Vic, Robert, William, etc are returned is because they are alphabetically after the value of "Maria"
Maria's string length is 5 characters, so use length function to find length of individual names and check it to be greater than 5 as below:
SELECT FirstName
FROM Members
WHERE length(FirstName) > 5;
Or if your name is going to be dynamic, you could use like:
SELECT FirstName
FROM Members
WHERE length(FirstName) > length("Maria");
If you need all names that comes after Maria and length greater than 5 then use:
SELECT FirstName
FROM Members
WHERE FirstName > 'Maria';
AND length(FirstName) > length('Maria');