Generate result in CSV file using prepared statement query in laravel - mysql

I have created this query to generate report and its working fine but i want to download the result of this query in .CSV file. How to execute this query in laravel ?
Query :
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when wm.SubPointId = ''',
wm.SubPointId,
''' then Balance else 0 end) AS ',
REPLACE ( ws.SubPointType, ' ', '' )
)
) INTO #sql
FROM wallet_master wm, wallet_subpoints ws WHERE wm.SubPointId = ws.SubPointId;
SET #sql = CONCAT('SELECT MobileNo, ', #sql, ', sum(Balance) as `TotalBalance`
FROM wallet_master wm
GROUP BY MobileNo');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Related

How to print more than one values in Pivot Table?

I Have a table Attendances
and then I Make a Report using this Query
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(case when `tanggal` = ''',
`tanggal`,
''' then `in_time` end) AS `',
`tanggal`, '`'
) ORDER BY `id_employee` ASC SEPARATOR ',\n'
) INTO #sql
FROM `attendances` ;
SET #sql2 = CONCAT('SELECT id_employee, ', #sql, ' FROM attendances GROUP BY id_employee');
PREPARE stmt FROM #sql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Output Query :
Question : I Want To Print in_time and out_time after clause then ? Is it Possible ?
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(case when `tanggal` = ''', `tanggal`, ''' then CONCAT(in_time,''-'', out_time) end) AS `', `tanggal`, '`'
) ORDER BY `id_employee` ASC SEPARATOR ',\n'
) INTO #sql
FROM `attendances` ;
SET #sql2 = CONCAT('SELECT id_employee, ', #sql, ' FROM attendances GROUP BY id_employee');
PREPARE stmt FROM #sql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Unable to pass parameter value in Concat select Prepared statements

I found the stored procedure does not execute only this portion:
SET #sql
= CONCAT('SELECT TraineeID, ', #sql, '
from tbl_submit_coursefee c
where c.BatchID='BID'
group by c.TraineeID');
in where clause '' quotes do not allow and without quotes query return empty but if I put the parameter value in where clause straight then it works. I'm really stack with this.
Here is my prepared statement (working fine):
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = ''', BillNo, ''', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO #sql
FROM tbl_submit_coursefee
WHERE BatchID="ID-Welding/FMMTTC-01M/R8/01";
SET #sql
= CONCAT('SELECT TraineeID, ', #sql, '
from tbl_submit_coursefee c
where c.BatchID="ID-Welding/FMMTTC-01M/R8/01"
group by c.TraineeID');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
when put this statement in a stored procedure (not working):
DELIMITER ##
DROP PROCEDURE GetRetainment ##
CREATE PROCEDURE vtproject.GetRetainment
(IN `BID` VARCHAR(100))
BEGIN
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = '', BillNo, '', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO #sql
FROM tbl_submit_coursefee
WHERE BatchID=BID;
SET #sql
= CONCAT('SELECT TraineeID, ', #sql, '
from tbl_submit_coursefee c
where c.BatchID='BID'
group by c.TraineeID');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ##
DELIMITER ;
If I select #sql before prepare stmt FROM #sql then output as below:
SELECT TraineeID, MAX(IF(BillNo = 1, CRA, NULL)) AS `Inv.1`,MAX(IF(BillNo = 2, CRA, NULL)) AS `Inv.2`,MAX(IF(BillNo = 3, CRA, NULL)) AS `Inv.3`,MAX(IF(BillNo = 4, CRA, NULL)) AS `Inv.4`,MAX(IF(BillNo = 5, CRA, NULL)) AS `Inv.5`,MAX(IF(BillNo = 6, CRA, NULL)) AS `Inv.6`,MAX(IF(BillNo = 7, CRA, NULL)) AS `Inv.7` from tbl_submit_coursefee c where c.BatchID=BID group by c.TraineeID
you need to escape the quotes,
like this :
SET #sql
= CONCAT('SELECT TraineeID, ', #sql, '
from tbl_submit_coursefee c
where c.BatchID=''',BID,'''
group by c.TraineeID');
according with doc : http://dev.mysql.com/doc/refman/5.7/en/string-literals.html
I found the solution in another way myself.
BEGIN
SET #sql = NULL;
SET #bid=BID;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = ', BillNo, ', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO #sql
FROM tbl_submit_coursefee
WHERE BatchID=#bid;
SET #sql
= CONCAT('SELECT TraineeID, ', #sql, '
from tbl_submit_coursefee c
where c.BatchID=#bid
group by c.TraineeID');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

Create table from a previous prepared statemt

Hi i've got something like this as part of a more complex query:
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Rather than executing the stmt itself i want to create a table from the result of the execute.
Create table A as select * from (Execute stmt)
gives me error
EDIT:
Here's the entire stuff:
Use catdatabase;
SET SESSION group_concat_max_len = 1000000;
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN columnA = "' ,columnA, '"THEN 1 ELSE 0 end) AS "' ,columnA, '"'))
INTO #sql
FROM
tableB;
SET #sql = CONCAT('SELECT columnB, Count(*) total, ', #sql, '
FROM tableA inner join tableB on tableA.columnC = tableB.columnE where tableA.columnD <> "catpoop"
GROUP BY columnB');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
As I can see you want to pivot your data and wants to save into temporary table.
I have updated your query, Please check out this:
Use catdatabase;
SET SESSION group_concat_max_len = 1000000;
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN columnA = "' ,columnA, '"THEN 1 ELSE 0 end) AS "' ,columnA, '"'))
INTO #sql
FROM
tableB;
SET #sql = CONCAT('Create temporary table temp SELECT columnB, Count(*) total, ', #sql, ' FROM tableA inner join tableB on tableA.columnC = tableB.columnE where tableA.columnD <> "catpoop"
GROUP BY columnB');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
If you get any error in this just let me know.
set #table='t2';
SET #table1 = 'test';
set #a = concat('create table ',#table,' select * from ',#table1);
prepare stmt1 from #a;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
https://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html
updated:
SET SESSION group_concat_max_len = 1000000;
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN columnA = "' ,columnA, '"THEN 1 ELSE 0 end) AS "' ,columnA, '"'))
INTO #sql
FROM
tableB;
SET #sql = CONCAT('SELECT columnB, Count(*) total, ', #sql, '
FROM tableA inner join tableB on tableA.columnC = tableB.columnE where tableA.columnD <> "catpoop"
GROUP BY columnB');
set #new_sql = concat ('create table A',#sql);
PREPARE stmt FROM #new_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

How to generate dynamic cross tab query

I am trying to create a cross tab query and i have written the following query.when i am running it getting an error.so please suggest me right syntax to get cross tab query.
set #sql=null;
select group_concat(distinct concat('sum(case when TX_NAME="',TX_NAME,
'" then sum(FL_AMOUNT) else 0 end ) as ',TX_NAME))into #sql
from cmn_test_bill_x_value ;
set #sq l=con cat('select b.KYS_ID,b.FKYS_CLIENT_ID,',#sql,'
from cmn_bill b left join cmn_patient_bill_details bd
on b.KYS_ID=bd.FKYS_BILL_ID
left join cmn_test_bill_type t
on bd.FKYS_BILL_CATEGORY=t.KYS_ID
left join cmn_test_bill_x_value x
on bd.FKYS_BILL_SUB_CATEGORY=x.KYS_ID
group by x.TX_NAME');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEAL LOCATE PREPARE stmt;
UPDATED: Try
SET #sql = NULL;
SET #month = '2014-02-01';
SELECT GROUP_CONCAT(DISTINCT CONCAT('SUM(CASE WHEN TX_NAME=''', tx_name,
''' THEN fl_amount ELSE 0 END) AS `', tx_name, '`'))
INTO #sql
FROM cmn_test_bill_x_value;
SET #sql = CONCAT('
SELECT b.KYS_ID, b.FKYS_CLIENT_ID, ', #sql, '
FROM cmn_bill b LEFT JOIN cmn_patient_bill_details bd
ON b.kys_id = bd.fkys_bill_id LEFT JOIN cmn_test_bill_type t
ON bd.fkys_bill_category=t.kys_id LEFT JOIN cmn_test_bill_x_value x
ON bd.fkys_bill_sub_category=x.kys_id
WHERE b.date >= ''', #month , '''
AND b.date < ''', #month + INTERVAL 1 MONTH - INTERVAL 1 DAY, '''
GROUP BY x.TX_NAME');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Here is SQLFiddle demo

Convert this MySQL to Sybase

I have the following MySQL:
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when perm = ''',
perm,
''' then 1 else 0 end) AS ',
perm
)
) INTO #sql
FROM perms;
SET #sql = CONCAT('SELECT role, ', #sql, '
FROM perms
GROUP BY role');
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
However, I have to use Sybase 12, does anyone know how to convert this?
Try this:
declare cur_perm cursor for
select perm from perms
go
declare #sql varchar(4000)
declare #perm varchar(4000)
set #sql = ' '
open cur_perm
fetch cur_perm into #perm
while ##sqlstatus=0 begin
select #sql = #sql+'sum(case when perm = '''+#perm+''' then 1 else 0 end) AS '''+#perm+''', '
fetch cur_perm into #perm
end
close cur_perm
deallocate cursor cur_perm
select #sql = 'SELECT '+ #sql+' role
FROM perms
GROUP BY role'
exec(#sql)