How to make MySQL code shorter? - mysql

Im trying to do a date filter for my report generate form. I have a DateTimePicker with checkbox in this form, If checkbox checked the query will add a WHERE clause.
Currently Im doing this way:-
If DateTimePicker1.Checked Then
query = "SELECT payment_type, sales_payment_dtl.payment_amt, payment_remark, sales_payment_dtl.created_date, sales.inv_no
FROM sales_payment_dtl
INNER JOIN sales_payment
ON sales_payment_dtl.payment_id = sales_payment.payment_id
INNER JOIN sales
ON sales_payment.sales_id = sales.sales_id
WHERE sales_payment_dtl.created_date = '"& DateTimePicker.Text &"'"
Else
query = "SELECT payment_type, sales_payment_dtl.payment_amt, payment_remark, sales_payment_dtl.created_date, sales.inv_no
FROM sales_payment_dtl
INNER JOIN sales_payment
ON sales_payment_dtl.payment_id = sales_payment.payment_id
INNER JOIN sales
ON sales_payment.sales_id = sales.sales_id"
End If
Is it possible to make the code shorter? Because I need to add somemore filter in future, then the code will become very long, Maybe something like this?
query = "SELECT payment_type, sales_payment_dtl.payment_amt, payment_remark, sales_payment_dtl.created_date, sales.inv_no
FROM sales_payment_dtl
INNER JOIN sales_payment
ON sales_payment_dtl.payment_id = sales_payment.payment_id
INNER JOIN sales
ON sales_payment.sales_id = sales.sales_id
IF '"& DateTimePicker.Checked = True &"' THEN
WHERE sales_payment_dtl.created_date = '"& DateTimePicker.Text &"'
ELSE
do nothing"

Simple logic.
query = "SELECT payment_type, sales_payment_dtl.payment_amt, payment_remark, sales_payment_dtl.created_date, sales.inv_no " & _
"FROM(sales_payment_dtl) " & _
"INNER JOIN sales_payment " & _
"ON sales_payment_dtl.payment_id = sales_payment.payment_id " & _
"INNER JOIN sales " & _
"ON sales_payment.sales_id = sales.sales_id"
If DateTimePicker1.Checked Then
query &= " WHERE sales_payment_dtl.created_date = '" & DateTimePicker.Text & "'"
End If

Related

Union ALL query failed in VBA but ok in SQL

I Tried to run the below Query but its showing an error incorrect syntax near 'unionselect' Can anyone help?
strsql = "select distinct a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from eqdet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where PERIL=1" & _
"union" & _
"select distinct a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from hudet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where peril=2" & _
"union" & _
"select distinct a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from todet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where peril=3" & _
"union" & _
"select a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from fldet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where peril=4" & _
"union" & _
"select distinct a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from frdet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where peril=5" & _
"union" & _
"select distinct a.LOCID,locnum,locname,streetname,city,county,statecode,state,peril,SITEDEDAMT,SITELIMAMT,COMBINEDDEDAMT,COMBINEDLIMAMT from trdet a inner join loccvg b on a.LOCID=b.locid inner join loc c on b.LOCID=c.LOCID where peril=6"
Looking at the error message I suspect you are concatinating a string to make the query. unionselect should be two words, seperated by a space. (union select) I think that in your code spaces are missing to separate keywords.
See:
"...where PERIL=1" & _ "union" & _ "select distinct..."
will produce
...where PERIL=1unionselect distinct...
output. Correct code (notice the spaces around the union):
"...where PERIL=1" & _ " union " & _ "select distinct ..."

making strsql from sql with different tables

So i need to make a strsql like this one :
strSQL = "SELECT "
strSQL = strSQL & " tblclips.fldclipid, "
strSQL = strSQL & " tblPlatenfirma.fldplatenfirmaID, "
strSQL = strSQL & " tblClips.fldUitvoerder, "
strSQL = strSQL & " tblClips.fldTitel, "
strSQL = strSQL & " tblPlatenfirma.fldnaam"
strSQL = strSQL & " FROM "
strSQL = strSQL & " tblClips "
strSQL = strSQL & " INNER JOIN tblPlatenfirma "
strSQL = strSQL & " ON tblClips.fldplatenfirmaid = tblPlatenfirma.fldplatenfirmaID"
strWHERE = ""
But i got a SQL code that I don't understand so with the result I can't make a strSQL, I really need this for a school project and i got a few days left. This is the SQL i don't understand:
SELECT tbluurroosterleerkracht.flduurroosterleerkrachtID AS uurroosterID, tblklas.fldnaam AS Klas, tbllokaal.fldnummer AS Hoofdlokaal, tblvak.fldvak AS Vak, tbllokaal_1.fldnaam AS LesLokaal, tbllokaal_2.fldbeschikbaar AS beschikbaar, tblleerkracht.fldnaam AS NaamLeerkrachtNormaal, tblleerkracht.fldvoornaam AS VoornaamLeerkrachtnormaal, tbldag.flddag AS Dag, tbllesuur.fldvan AS Van, tbllesuur.fldtot AS Tot
FROM (((tbllokaal AS tbllokaal_2 RIGHT JOIN (tblvervangingen LEFT JOIN tblleerkracht AS tblleerkracht_1 ON tblvervangingen.fldleerkrachtID = tblleerkracht_1.fldleerkrachtID) ON tbllokaal_2.fldlokaalID = tblvervangingen.fldlokaalID) LEFT JOIN tbltaak ON tblvervangingen.fldtaakID = tbltaak.fldtaakID) LEFT JOIN tblleerkracht AS tblleerkracht_2 ON tbltaak.fldleerkrachtID = tblleerkracht_2.fldleerkrachtID) RIGHT JOIN (((tbllokaal AS tbllokaal_1 INNER JOIN (((tbldag INNER JOIN (tblklas INNER JOIN tbluurroosterleerkracht ON tblklas.fldklasID = tbluurroosterleerkracht.fldklasID) ON tbldag.flddagID = tbluurroosterleerkracht.flddagID) INNER JOIN tblvak ON tbluurroosterleerkracht.fldvakID = tblvak.fldvakID) INNER JOIN tbllokaal ON tblklas.fldlokaalID = tbllokaal.fldlokaalID) ON tbllokaal_1.fldlokaalID = tbluurroosterleerkracht.fldlokaalID) INNER JOIN tbllesuur ON tbluurroosterleerkracht.fldlesuurID = tbllesuur.fldlesuurID) INNER JOIN tblleerkracht ON tbluurroosterleerkracht.fldleerkrachtID = tblleerkracht.fldleerkrachtID) ON tblvervangingen.flduurroosterleerkrachtID = tbluurroosterleerkracht.flduurroosterleerkrachtID
ORDER BY tblleerkracht.fldnaam, tblleerkracht.fldvoornaam, tbldag.flddag, tbllesuur.fldvan;
It is an unusual SQL query. Are you sure it produces the result you want?
When trying to understand code it is useful to format it so that you can clearly see each part of it. This is particularly true for big SQL queries, and code with lots of nested bracketted bits.
Here is the SQL with my rough formatting applied...
SELECT
tbluurroosterleerkracht.flduurroosterleerkrachtID AS uurroosterID,
tblklas.fldnaam AS Klas,
tbllokaal.fldnummer AS Hoofdlokaal,
tblvak.fldvak AS Vak,
tbllokaal_1.fldnaam AS LesLokaal,
tbllokaal_2.fldbeschikbaar AS beschikbaar,
tblleerkracht.fldnaam AS NaamLeerkrachtNormaal,
tblleerkracht.fldvoornaam AS VoornaamLeerkrachtnormaal,
tbldag.flddag AS Dag,
tbllesuur.fldvan AS Van,
tbllesuur.fldtot AS Tot
FROM
(
(
(tbllokaal AS tbllokaal_2
RIGHT JOIN (tblvervangingen
LEFT JOIN tblleerkracht AS tblleerkracht_1
ON tblvervangingen.fldleerkrachtID = tblleerkracht_1.fldleerkrachtID
)
ON tbllokaal_2.fldlokaalID = tblvervangingen.fldlokaalID
)
LEFT JOIN tbltaak
ON tblvervangingen.fldtaakID = tbltaak.fldtaakID
)
LEFT JOIN tblleerkracht AS tblleerkracht_2
ON tbltaak.fldleerkrachtID = tblleerkracht_2.fldleerkrachtID
)
RIGHT JOIN
(
(
(tbllokaal AS tbllokaal_1
INNER JOIN
(
(
(tbldag
INNER JOIN
(tblklas
INNER JOIN tbluurroosterleerkracht
ON tblklas.fldklasID = tbluurroosterleerkracht.fldklasID
)
ON tbldag.flddagID = tbluurroosterleerkracht.flddagID
)
INNER JOIN tblvak
ON tbluurroosterleerkracht.fldvakID = tblvak.fldvakID
)
INNER JOIN tbllokaal
ON tblklas.fldlokaalID = tbllokaal.fldlokaalID
)
ON tbllokaal_1.fldlokaalID = tbluurroosterleerkracht.fldlokaalID
)
INNER JOIN tbllesuur
ON tbluurroosterleerkracht.fldlesuurID = tbllesuur.fldlesuurID
)
INNER JOIN tblleerkracht
ON tbluurroosterleerkracht.fldleerkrachtID = tblleerkracht.fldleerkrachtID
)
ON tblvervangingen.flduurroosterleerkrachtID = tbluurroosterleerkracht.flduurroosterleerkrachtID
ORDER BY
tblleerkracht.fldnaam,
tblleerkracht.fldvoornaam,
tbldag.flddag,
tbllesuur.fldvan;
Is there a specific part that you do not understand?
I think despite not understanding how the SQL works. Your string building method should still work as a way to store the sql in a program variable.

MySQL Sum() from derived column

I am joining product and cart table to calculate for the total price for each cart. Here is my sql statement:
String sql = "SELECT p.productID, p.productName, p.productPrice, c.quantity, p.productPrice * c.quantity as new_unit_price, SUM(p.productPrice * c.quantity) AS totalPrice"
+ " FROM sm_product p INNER JOIN sm_cart c "
+ "ON p.productID = c.productID"
+ " WHERE c.custName = '" + custName + "'";
I derived a column named new_unit_price by multiplying the quantity from cart table and product price from product table. Then I want to use the derived column which is new_unit_price to sum up the price of all item in the cart. I get the data from the column in database by:
double subItemTotal = rs.getDouble("new_unit_price");
double totalPrice = rs.getDouble("totalPrice");
My new_unit_price works. But unfortunately, my sum does not works. It's still 0. Does anybody know how can I sum up the value from derived column? Thanks in advance.
To use the SUM() function, you'll need to do a GROUP BY at the end of your statement.
This should get your overall cart total:
String sql = "SELECT c.custname "
+ ", SUM(p.productPrice * c.quantity) AS totalPrice"
+ " FROM sm_product p INNER JOIN sm_cart c "
+ "ON p.productID = c.productID"
+ " AND c.custName = '" + custName + "'"
+ " GROUP BY c.custname;"
Also, I changed the WHERE to an AND so it is evaluated earlier and should make the query faster.
If you want the new_unit_price and the cart total in the same query, you have to go back into the tables again to get that data. Something like this should work:
String sql = "SELECT p.productID, p.productName, p.productPrice, c.quantity "
+ ", p.productPrice * c.quantity as new_unit_price, total.totalPrice FROM "
+ "( "
+ "SELECT c.custname "
+ ", SUM(p.productPrice * c.quantity) AS totalPrice"
+ " FROM sm_product p INNER JOIN sm_cart c "
+ "ON p.productID = c.productID"
+ " AND c.custName = '" + custName + "'"
+ " GROUP BY c.custname"
+ ") AS total "
+ "INNER JOIN sm_cart c "
+ "ON total.custname=c.custname "
+ "INNER JOIN sm_product p "
+ "ON p.productID = c.productID "

Laravel: Is it possible to do a union query with Fluent or Eloquent?

I have a complex union query that I would like to translate from MS SQL to MySQL using either Laravel's Fluent query builder or Eloquent (just guessing only Fluent could handle it). The other alternative would be to simply us a DB Raw query, but that doesn't seem very Laravelish.
I do this as part of a recurring events engine to connect a past events history table with the futures table that holds the recurrence pattern. Here's the query if you're interested.
qry = "SELECT clients.p_client_id,contacts.last_name, contacts.first_name, "
qry = qry & "resource_information.last_name as res_last_name, resource_information.first_name as res_first_name, "
qry = qry & "assets.d_name, "
qry = qry & "services.service_name, "
qry = qry & "service_recurring.id, service_recurring.client_id, service_recurring.partner_id, "
qry = qry & "service_recurring.asset_id, service_recurring.resource_id, service_recurring.service_id, "
qry = qry & "service_recurring.begin_on, service_recurring.window_beg, "
qry = qry & "service_recurring.window_end, service_recurring.rate, "
qry = qry & "service_recurring.discount, service_recurring.res_cost, service_recurring.recurring, service_recurring.id as schedule_id "
qry = qry & "FROM service_recurring "
qry = qry & "INNER JOIN clients ON service_recurring.client_id = clients.id "
qry = qry & "INNER JOIN contacts ON service_recurring.client_id = contacts.client_id "
qry = qry & "AND contacts.primary_contact = 1 "
qry = qry & "INNER JOIN assets ON service_recurring.asset_id = assets.id "
qry = qry & "INNER JOIN resource_information ON service_recurring.resource_id = resource_information.id "
qry = qry & "INNER JOIN services ON service_recurring.service_id = services.id "
qry = qry & "WHERE service_recurring.partner_id = '" & partner_id & "' "
qry = qry & "AND NOT EXISTS (SELECT * FROM service_recurring_exception WHERE rid = service_recurring.id AND exception_date = '" & thisDate & "' AND pid = '" & partner_id & "') "
qry = qry & "AND service_recurring.begin_on <= '" & thisDate & "' "
qry = qry & "AND (service_recurring.end_on >= '" & thisDate & "' OR service_recurring.end_on is null) "
qry = qry & todayis
qry = qry & "UNION "
qry = qry & "SELECT clients.p_client_id,contacts.last_name, contacts.first_name, "
qry = qry & "resource_information.last_name as res_last_name, resource_information.first_name as res_first_name, "
qry = qry & "assets.d_name, "
qry = qry & "services.service_name, "
qry = qry & "service_history.id, service_history.client_id, service_history.partner_id, "
qry = qry & "service_history.asset_id, service_history.resource_id, service_history.service_id, "
qry = qry & "service_history.begin_on, service_history.window_beg, "
qry = qry & "service_history.window_end, service_history.rate, "
qry = qry & "service_history.discount, service_history.res_cost, service_history.recurring, service_history.id as schedule_id "
qry = qry & "FROM service_history "
qry = qry & "INNER JOIN clients ON service_history.client_id = clients.id "
qry = qry & "INNER JOIN contacts ON service_history.client_id = contacts.client_id "
qry = qry & "AND contacts.primary_contact = 1 "
qry = qry & "INNER JOIN assets ON service_history.asset_id = assets.id "
qry = qry & "INNER JOIN resource_information ON service_history.resource_id = resource_information.id "
qry = qry & "INNER JOIN services ON service_history.service_id = services.id "
qry = qry & "WHERE service_history.begin_on = '" & thisDate & "' AND service_history.partner_id = '" & partner_id & "' "
qry = qry & "AND service_history.delete_r <> 1 "
qry = qry & "ORDER BY res_last_name, d_name"

Query Change from MySQL to MS Access

i have a view in MySQL but for some reason i want it to write in MS Access..i have already imported neccessary tables. when i copy the view definaation from MySQL and write it in Access Query Design it gives me error on "Join operation".What's wrong here ?
View -> qryOccupation
select `a`.`Employee_ID` AS `Employee_ID`,`a`.`Employee_Name` AS `Employee_Name`,`a`.`Flat_No` AS `Flat_No`,`a`.`Area` AS `Area`,`a`.`Building_Name` AS `Building_Name`
from (`tblallotment` `a` join `tblflat` `f`)
where ((`a`.`Flat_No` = `f`.`Flat_No`)
and (`f`.`Status` = 'A')
and (not(`a`.`Employee_ID` in
(select `c`.`Employee_ID`
from (`tblallotment` `a` join `tblcancel_allotment` `c`)
where ((`a`.`Employee_ID` = `c`.`Employee_ID`)
and (`c`.`Date_Cancellation` = 0))))))
select a.Employee_ID AS Employee_ID,
a.Employee_Name AS Employee_Name,
a.Flat_No AS Flat_No,
a.Area AS Area,
a.Building_Name AS Building_Name
from tblallotment a
inner join tblflat f
on a.Flat_No = f.Flat_No
where f.Status = 'A'
and (not (a.Employee_ID in
(select c.Employee_ID
from tblallotment a
inner join tblcancel_allotment c
on a.Employee_ID = c.Employee_ID
where c.Date_Cancellation = 0)))
("SELECT [Department Name], " _
& "FirstName & Chr(32) & LastName AS Name " _
& "FROM Departments LEFT JOIN Employees " _
& "ON Departments.[Department ID] = " _
& "Employees.[Department ID] " _
& "ORDER BY [Department Name];")