Getting value twice in SQL - sql

I have a SQL like this;
SELECT B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2 AS 'TEKLIF',B.MUS_K_ISIM,
dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'11/03/2011', '11/03/2011'),
(CASE WHEN B.DOVIZ_KOD = 21 THEN 'EUR' WHEN B.DOVIZ_KOD = 2 THEN 'USD' WHEN B.DOVIZ_KOD = 1 THEN 'TL' END) AS 'KUR',
D.AVUKAT,
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN
(SELECT ICRA_TAR FROM TAKIP WHERE T_HESAP_NO = D.HESAP)
ELSE ' ' END) AS 'ICRA TARİHİ',
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN
(SELECT HACIZ_TAR FROM TAKIP WHERE T_HESAP_NO = D.HESAP)
ELSE '' END) AS 'HACİZ TARİHİ'
FROM YAZ..MARDATA.S_TEKLIF B, AVUKAT D
WHERE B.HESAP_NO = D.HESAP
AND ISNULL(dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'11/03/2011', '11/03/2011'),0) > 0
GROUP BY B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,B.DOVIZ_KOD ,B.MUS_K_ISIM, D.AVUKAT, D.HESAP
Here is my tables;
S_TEKLIF (B) AVUKAT TAKIP
HESAP_NO (PK) HESAP(PK) T_HESAP_NO (PK)
TEKLIF_NO1 MUS_K_ISIM ICRA_TAR
TEKLIF_NO2 AVUKAT HACIZ_TAR
MUS_K_ISIM
DOVIZ_KOD
And here is mine dbo.fngcodeme Function;
ALTER FUNCTION [dbo].[fngcodeme]
(
#HESAP INT, #DOV INT, #TEKLIF VARCHAR(10), #BAS VARCHAR(10), #BIT VARCHAR(10)
)
RETURNS FLOAT
AS
BEGIN
DECLARE #Result FLOAT
SET #Result = (SELECT SUM(TUTAR)
FROM YAZ..MARDATA.M_GHAREKET
WHERE TEMEL_HESAP = #HESAP
AND DOVIZ_KOD = #DOV
AND REF_KOD = 'GC'
AND BACAK_GRUP = 'PERT'
AND ISL_KOD = 1
AND ACIKLAMA LIKE '%' + #TEKLIF + '%'
AND ISL_TAR >= CONVERT(DATETIME, + '' + #BAS + '',103)
AND ISL_TAR <= CONVERT(DATETIME, + '' + #BIT + '',103)
)
RETURN #Result
END
My top SQL is working perfect but gettin two value with the same data.
Where the error i could be doing?
Best Regards,
Soner

It is not the same, the TEKLIF column differs. You group on that column, hence you will get two results of they differ.

Related

Insert rows from one table to columns of another table with specific pattern

I have following table
I need to transform above data to another table in following format
Also source table will have varying number of TypeOfContact, thus I need a target table with dynamically generated column names.
I am literally clueless about how to write a sql query to achieve this
You may use pivoting logic along with ROW_NUMBER:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY RequestId, TypeOfContact
ORDER BY ContactEmail) rn
FROM yourTable
)
SELECT
RequestId,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 1
THEN ContactName) AS SiteName1,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 1
THEN ContactEmail) AS SiteEmail1,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 2
THEN ContactName) AS SiteName2,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 2
THEN ContactEmail) AS SiteEmail2,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 3
THEN ContactName) AS SiteName3,
MAX(CASE WHEN TypeOfContact = 'Site' AND rn = 3
THEN ContactEmail) AS SiteEmail3,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 1
THEN ContactName) AS PrimaryName1,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 1
THEN ContactEmail) AS PrimaryEmail1,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 2
THEN ContactName) AS PrimaryName2,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 2
THEN ContactEmail) AS PrimaryEmail2,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 3
THEN ContactName) AS PrimaryName3,
MAX(CASE WHEN TypeOfContact = 'Primary' AND rn = 3
THEN ContactEmail) AS PrimaryEmail3
FROM cte
GROUP BY
RequestId;
CREATE TABLE #temp
(
requestid INT,
primaryname1 VARCHAR(50),
primaryemail1 VARCHAR(50),
sitename1 VARCHAR(50),
siteemail1 VARCHAR(50)
)
SELECT *
INTO #row
FROM (SELECT m.*,
Row_number()
OVER(
partition BY requestid, typeofcontact
ORDER BY typeofcontact) rn
FROM <your_table> m) m
DECLARE #max_row INT,
#current_row VARCHAR(5) = '1',
#SQL VARCHAR(max) = '',
#alter_SQL VARCHAR(max) = '';
SELECT #max_row = Max(rn)
FROM #row;
WHILE #current_row <= #max_row
BEGIN
IF #current_row <> '1'
BEGIN
SET #alter_SQL = 'ALTER TABLE #temp add primaryname'
+ #current_row + ' varchar(50), primaryemail'
+ #current_row + ' varchar(50), sitename' + #current_row
+ ' varchar(50), siteemail' + #current_row
+ ' varchar(50)'
EXEC(#alter_SQL)
END
SET #SQL = #SQL + ',MAX(CASE WHEN rn=' + #current_row
+ ' and TypeOfContact = ''Primary'' THEN ContactName END) "a'
+ #current_row + '" ,MAX(CASE WHEN rn='
+ #current_row
+ ' and TypeOfContact = ''Primary'' THEN ContactEmail END) "b'
+ #current_row + '" ,MAX(CASE WHEN rn='
+ #current_row
+ ' and TypeOfContact = ''Site'' THEN ContactName END) "c'
+ #current_row + '" ,MAX(CASE WHEN rn='
+ #current_row
+ ' and TypeOfContact = ''Site'' THEN ContactEmail END) "d'
+ #current_row + '"'
SET #current_row = Cast(( Cast(#current_row AS INT) + 1 ) AS INT)
END
SET #SQL = 'insert into #temp SELECT requestid' + #SQL
+ 'FROM #row group by RequestId'
EXEC(#SQL)
SELECT *
FROM cust
SELECT *
FROM #temp

Case with Like operator

Got stuck at using CASE statement with LIKE operator. In the below stored procedure all the parameters are not mandatory so when User doesn't enter PatientName for searching then the below query doesn't return expected results as the LIKE operator is outside which is obvious. I'm looking for something like this so that when User doesn't enter PatientName it will be
(c.LastName + c.Firstname) = #PatientNAme else
(c.LastName + c.Firstname) like '%' + #PatientNAme + '%'
*
(c.LastName + c.Firstname) (
CASE #PatientName
WHEN '' THEN #PatientName = (c.LastName + c.Firstname)
ELSE like '%' + #PatientName + '%'
END
)
*
CREATE proc [dbo].[SearchParkPrescriptionDetails]
#DispenseID INT,
#ParkPrescriptionReasonId INT,
#PrescriptionParkType VARCHAR(50),
#PatientName VARCHAR(120),
#User VARCHAR(120),
#fromdate DATETIME,
#todate DATETIME,
#DateWiseSearch VARCHAR(3),
#PatientID INT
AS
BEGIN
SELECT
a.ParkPrescriptionId
, a.DispenseID
, a.ParkPrescriptionReasonId
, a.ParkDate
, (c.LastName + ' ' + c.Firstname) AS PatientName
, d.PrescriptionType
, e.ParkPrescriptionReason
, a.Notes
, b.ItemCount AS TotalItems
, g.ExemptionReason
,a.[User]
FROM
ParkPrescriptionDetails a
INNER JOIN
Dis_DispenseMaster b
ON
a.DispenseID=b.DispenseID
INNER JOIN
Patient c
ON
b.PatientId = c.PatientId
INNER JOIN
Lookup_PrescriptionType d
ON
b.PrescriptionTypeId = d.PrescriptionTypeId
INNER JOIN
Lookup_ParkPrescriptionReason e
ON
a.ParkPrescriptionReasonId = e.ParkPrescriptionReasonId
LEFT JOIN
Lookup_ExemptionReason g
ON
b.ExemptionReasonId = g.ExemptionReasonId
WHERE
CONVERT(DATE, a.ParkDate) BETWEEN #fromdate AND #todate
AND a.RecallStatus = 'N'
AND a.DispenseID = ( CASE #DispenseID WHEN 0 THEN a.DispenseID ELSE #DispenseID END )
AND b.PatientId = ( CASE #PatientID WHEN 0 THEN b.PatientId ELSE #PatientID END )
AND a.ParkPrescriptionReasonId = ( CASE #ParkPrescriptionReasonId WHEN 0 THEN a.ParkPrescriptionReasonId ELSE #ParkPrescriptionReasonId END )
AND
(
c.LastName + c.Firstname
) LIKE ( CASE #PatientName WHEN '' THEN (c.LastName + c.Firstname) ELSE '%' + #PatientName + '%' END )
AND a.[User] LIKE ( CASE #User WHEN '' THEN a.[User] ELSE '%' + #User + '%' END )
AND b.ParkPrescription = ( CASE #PrescriptionParkType WHEN '' THEN b.ParkPrescription WHEN 'Park' THEN 'Y' END )
AND b.RecallPrescription = ( CASE #PrescriptionParkType WHEN '' THEN b.RecallPrescription WHEN 'Recall' THEN 'Y' END )
AND a.IsDeleted =0
END
========== Changed it Like this. Is this perfect ===========
(c.LastName + ' ' + c.Firstname) = (
CASE #PatientName
WHEN '' THEN (c.LastName + ' ' + c.Firstname)
ELSE '%' + #PatientName + '%'
END
)
Do not use CASE WHEN in where clause. Use OR
(
#PatientName = '' OR
(c.LastName + c.Firstname) LIKE '%' + #PatientName + '%'
) AND
(
#User = '' OR
a.[User] LIKE '%' + #User + '%'
) -- Same for others
instead of
(c.LastName + ' ' + c.Firstname) = (
CASE #PatientName
WHEN '' THEN (c.LastName + ' ' + c.Firstname)
ELSE '%' + #PatientName + '%'
END
)
T-SQL has two forms of CASE. You are using "Simple Case". Try "Searched Case" - e.g.:
CASE
WHEN #PatientName = '' THEN [ return something ]
WHEN #PatientName like [ pattern ] THEN [ return something ]
ELSE [ return something else ]
END

SQL converting CSV text to Table

I have a table with a list of customer orders (s84_Schedule). I have a second table with comments on the orders (s84_ScheduleNotes). When I pull the list of orders from s84_Schedule, I do a left outer join to get the latest comment from s84_ScheduleNotes, because there are not always comments on every order.
Problem: I also have a SQL function that converts a comma-separated list of ProductIDs into a temporary table; this function does not seem to be working properly. I do not understand how these are related, but... If I use only one Product ID (meaning, no comma in the ProductVal variable), the left outer join never pulls in the latest comment from s84_ScheduleNotes. However, if I provide 2 ProductIDs separated by commas in ProductVal, the latest comment will show up.
Here is the code that converts the CSV to a temp table (stole this off the internet somewhere a long time ago)...
CREATE FUNCTION [dbo].[CSVToTable] (#InStr VARCHAR(MAX))
RETURNS #TempTab TABLE
(id int not null)
AS
BEGIN
;-- Ensure input ends with comma
SET #InStr = REPLACE(#InStr + ',', ',,', ',')
DECLARE #SP INT
DECLARE #VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', #INSTR ) <> 0
BEGIN
SELECT #SP = PATINDEX('%,%',#INSTR)
SELECT #VALUE = LEFT(#INSTR , #SP - 1)
SELECT #INSTR = STUFF(#INSTR, 1, #SP, '')
INSERT INTO #TempTab(id) VALUES (#VALUE)
END
RETURN
END
GO
Here is my procedure which pulls the orders and the comments...
CREATE PROCEDURE dbo.GetFilteredSchedule
(
#InstallDateOperator INT,
#InstallDateRange1 DATETIME,
#InstallDateRange2 DATETIME,
#InstallDateDynRange1 INT,
#InstallDateDynRange2 INT,
#CustExpectedOperator INT,
#CustExpectedRange1 DATETIME,
#CustExpectedRange2 DATETIME,
#CustExpectedDynRange1 INT,
#CustExpectedDynRange2 INT,
#CompletedDateOperator INT,
#CompletedDateRange1 DATETIME,
#CompletedDateRange2 DATETIME,
#CompletedDateDynRange1 INT,
#CompletedDateDynRange2 INT,
#ProdInStoreDateOperator INT,
#ProdInStoreDateRange1 DATETIME,
#ProdInStoreDateRange2 DATETIME,
#ProdInStoreDateDynRange1 INT,
#ProdInStoreDateDynRange2 INT,
#InvoiceNumVal VARCHAR(2000),
#InstallerVal VARCHAR(2000),
#CustomerVal VARCHAR(2000),
#SubdivisionVal VARCHAR(2000),
#ProductVal VARCHAR(2000),
#LotNumVal VARCHAR(2000),
#EstimateNumVal VARCHAR(2000),
#SONumVal VARCHAR(2000),
#ProdInStoreVal BIT,
#OrderProcessedVal BIT,
#StatusVal VARCHAR(2000),
#FieldRepVal VARCHAR(2000),
#WorkOrderNumVal VARCHAR(2000),
#WindowVal VARCHAR(2000),
#StoreVal VARCHAR(2000),
#DriverVal VARCHAR(2000),
#YardEmployeeVal VARCHAR(2000),
#TruckTypeVal VARCHAR(2000),
#LotNumExact INT,
#StatusIDExact INT,
#SearchText VARCHAR(2000),
#CustomerIdRestriction VARCHAR(2000),
#OrderBy1 INT,
#OrderBy2 INT
)
AS
BEGIN
SELECT sch.ScheduleID, sch.InstallDate, sch.CustomerExpectedDate, sch.CompletedDate, sch.InvoiceNumber,
sch.InstallerID, sch.CustomerID, sch.SubdivisionID, sch.ProductID, sch.LotNumber, sch.EstimateNumber, sch.SONumber,
sch.ProductInStore, sch.ProductInStoreDate, sch.OrderProcessed, sch.HomeownerInfo, sch.StatusID, sch.FieldRepID,
sch.WindowID, sch.StoreID, sch.ConnectedToProject, sch.DriverEmailAddress, sch.YardEmployeeEmailAddress, sch.TruckTypeID,
installer.InstallerName AS 'InstallerName',
customer.CustomerName AS 'CustomerName',
subdivision.SubdivisionName AS 'SubdivisionName',
product.ProductName AS 'ProductName',
fieldRep.FieldRepName AS 'FieldRepName',
window.WindowName AS 'WindowName',
store.StoreName AS 'StoreName',
stat.StatusName AS 'StatusName',
driver.LastName AS 'DriverLastName', driver.FirstName AS 'DriverFirstName',
yardEmployee.LastName AS 'YardEmployeeLastName', yardEmployee.FirstName AS 'YardEmployeeFirstName',
truckType.TruckTypeName AS 'TruckTypeName',
sch.ScheduleID AS id,
Cast(customer.CustomerName AS VARCHAR(2000)) + ' - ' + Cast(sch.LotNumber AS VARCHAR(2000)) + ' - ' + Cast(subdivision.SubdivisionName AS VARCHAR(2000)) + ' - ' + Cast(product.ProductName AS VARCHAR(2000)) AS 'title',
CONVERT(VARCHAR(50), sch.CustomerExpectedDate, 101) + ' ' + CONVERT(VARCHAR, DATEPART(hh, sch.CustomerExpectedDate)) + ':' + RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, sch.CustomerExpectedDate)), 2) AS 'start',
CONVERT(VARCHAR(50), DATEADD(hh, 1, sch.CustomerExpectedDate), 101) AS 'end',
stat.StatusColor AS 'backgroundColor',
note.NoteText AS 'NoteText'
FROM s84_Schedule sch
LEFT OUTER JOIN dbo.s84_ScheduleNotes AS note ON note.ScheduleID = (SELECT MAX(n.ScheduleNoteID) FROM dbo.s84_ScheduleNotes n WHERE n.ScheduleID = sch.ScheduleID)
JOIN dbo.s84_Installer AS installer ON sch.InstallerID = installer.InstallerID
JOIN dbo.s84_Customer AS customer on sch.CustomerID = customer.CustomerID
JOIN dbo.s84_Subdivision AS subdivision ON sch.SubdivisionID = subdivision.SubdivisionID
JOIN dbo.s84_Product AS product ON sch.ProductID = product.ProductID
JOIN dbo.s84_FieldRep AS fieldRep ON sch.FieldRepID = fieldRep.FieldRepID
JOIN dbo.s84_Window AS window ON sch.WindowID = window.WindowID
JOIN dbo.s84_Store AS store ON sch.StoreID = store.StoreID
JOIN dbo.s84_Status AS stat ON sch.StatusID = stat.StatusID
JOIN dbo.s84_TruckType AS truckType ON sch.TruckTypeID = truckType.TruckTypeID
LEFT OUTER JOIN dbo.s84_Employee AS driver ON ((#DriverVal IS NOT NULL) AND (driver.EmailAddress = #DriverVal))
LEFT OUTER JOIN dbo.s84_Employee AS yardEmployee ON ((#YardEmployeeVal IS NOT NULL) AND (yardEmployee.EmailAddress = #YardEmployeeVal))
WHERE
(#InvoiceNumVal IS NULL OR (sch.InvoiceNumber LIKE '%' + #InvoiceNumVal + '%')) AND
(#InstallerVal IS NULL OR (installer.InstallerID = #InstallerVal)) AND
(#CustomerVal IS NULL OR (customer.CustomerName LIKE '%' + #CustomerVal + '%')) AND
(#SubdivisionVal IS NULL OR (subdivision.SubdivisionName LIKE '%' + #SubdivisionVal + '%')) AND
(#ProductVal IS NULL OR ( sch.ProductID IN (SELECT * FROM dbo.CSVToTable(#ProductVal)) )) AND
(#LotNumVal IS NULL OR (sch.LotNumber LIKE '%' + #LotNumVal + '%')) AND
(#EstimateNumVal IS NULL OR (sch.EstimateNumber LIKE '%' + #EstimateNumVal + '%')) AND
(#SONumVal IS NULL OR (sch.SONumber LIKE '%' + #SONumVal + '%')) AND
(#ProdInStoreVal IS NULL OR (sch.ProductInStore = #ProdInStoreVal)) AND
(#OrderProcessedVal IS NULL OR (sch.OrderProcessed = #OrderProcessedVal)) AND
(#FieldRepVal IS NULL OR (fieldRep.FieldRepID = #FieldRepVal)) AND
(#WorkOrderNumVal IS NULL OR (sch.ScheduleID LIKE '%' + #WorkOrderNumVal + '%')) AND
(#WindowVal IS NULL OR (window.WindowName LIKE '%' + #WindowVal + '%')) AND
(#StoreVal IS NULL OR (store.StoreName LIKE '%' + #StoreVal + '%')) AND
(#DriverVal IS NULL OR ((driver.FirstName LIKE '%' + #DriverVal + '%') OR (driver.LastName LIKE '%' + #DriverVal + '%'))) AND
(#YardEmployeeVal IS NULL OR ((yardEmployee.FirstName LIKE '%' + #YardEmployeeVal + '%') OR (yardEmployee.LastName LIKE '%' + #YardEmployeeVal + '%'))) AND
(#TruckTypeVal IS NULL OR (truckType.TruckTypeName LIKE '%' + #TruckTypeVal + '%')) AND
(#LotNumExact IS NULL OR (sch.LotNumber = #LotNumExact)) AND
(#StatusIDExact IS NULL OR (sch.StatusID = #StatusIDExact)) AND
(#CustomerIdRestriction IS NULL OR ( sch.CustomerID IN (SELECT * FROM dbo.CSVToTable(#CustomerIdRestriction)) )) AND
(#StatusVal IS NULL OR
( sch.StatusID IN (SELECT * FROM dbo.CSVToTable(#StatusVal)) OR
(
('9999' IN (SELECT * FROM dbo.CSVToTable(#StatusVal)) ) AND
( sch.StatusID NOT IN (SELECT * FROM (VALUES ('1'), ('2'), ('3'), ('4')) AS X(id)) )
)
)
) AND
(((#InstallDateOperator IS NULL) OR (#InstallDateOperator = 99)) OR
(#InstallDateOperator = 1 AND sch.InstallDate = #InstallDateRange1) OR
(#InstallDateOperator = 2 AND sch.InstallDate <= #InstallDateRange1) OR
(#InstallDateOperator = 3 AND sch.InstallDate >= #InstallDateRange1) OR
(#InstallDateOperator = 4 AND sch.InstallDate >= #InstallDateRange1 AND sch.InstallDate <= #InstallDateRange2) OR
(#InstallDateOperator = 5 AND sch.InstallDate BETWEEN DATEADD(mm,-#InstallDateDynRange1,GETDATE()) AND DATEADD(mm,#InstallDateDynRange2,GETDATE()))
) AND
(((#CustExpectedOperator IS NULL) OR (#CustExpectedOperator = 99)) OR
(#CustExpectedOperator = 1 AND sch.CustomerExpectedDate = #CustExpectedRange1) OR
(#CustExpectedOperator = 2 AND sch.CustomerExpectedDate <= #CustExpectedRange1) OR
(#CustExpectedOperator = 3 AND sch.CustomerExpectedDate >= #CustExpectedRange1) OR
(#CustExpectedOperator = 4 AND sch.CustomerExpectedDate >= #CustExpectedRange1 AND sch.CustomerExpectedDate <= #CustExpectedRange2) OR
(#CustExpectedOperator = 5 AND sch.CustomerExpectedDate BETWEEN DATEADD(mm,-#CustExpectedDynRange1,GETDATE()) AND DATEADD(mm,#CustExpectedDynRange2,GETDATE()))
) AND
(((#CompletedDateOperator IS NULL) OR (#CompletedDateOperator = 99)) OR
(#CompletedDateOperator = 1 AND sch.CompletedDate = #CompletedDateRange1) OR
(#CompletedDateOperator = 2 AND sch.CompletedDate <= #CompletedDateRange1) OR
(#CompletedDateOperator = 3 AND sch.CompletedDate >= #CompletedDateRange1) OR
(#CompletedDateOperator = 4 AND sch.CompletedDate >= #CompletedDateRange1 AND sch.CompletedDate <= #CompletedDateRange2) OR
(#CompletedDateOperator = 5 AND sch.CompletedDate BETWEEN DATEADD(mm,-#CompletedDateDynRange1,GETDATE()) AND DATEADD(mm,#CompletedDateDynRange2,GETDATE()))
) AND
(((#ProdInStoreDateOperator IS NULL) OR (#ProdInStoreDateOperator = 99)) OR
(#ProdInStoreDateOperator = 1 AND sch.ProductInStoreDate = #ProdInStoreDateRange1) OR
(#ProdInStoreDateOperator = 2 AND sch.ProductInStoreDate <= #ProdInStoreDateRange1) OR
(#ProdInStoreDateOperator = 3 AND sch.ProductInStoreDate >= #ProdInStoreDateRange1) OR
(#ProdInStoreDateOperator = 4 AND sch.ProductInStoreDate >= #ProdInStoreDateRange1 AND sch.ProductInStoreDate <= #ProdInStoreDateRange2) OR
(#ProdInStoreDateOperator = 5 AND sch.ProductInStoreDate BETWEEN DATEADD(mm,-#ProdInStoreDateDynRange1,GETDATE()) AND DATEADD(mm,#ProdInStoreDateDynRange2,GETDATE()))
) AND
((#SearchText IS NULL) OR
( sch.InvoiceNumber LIKE '%' + #SearchText + '%' OR
installer.InstallerName LIKE '%' + #SearchText + '%' OR
customer.CustomerName LIKE '%' + #SearchText + '%' OR
subdivision.SubdivisionName LIKE '%' + #SearchText + '%' OR
product.ProductName LIKE '%' + #SearchText + '%' OR
sch.LotNumber LIKE '%' + #SearchText + '%' OR
sch.EstimateNumber LIKE '%' + #SearchText + '%' OR
sch.SONumber LIKE '%' + #SearchText + '%' OR
stat.StatusName LIKE '%' + #SearchText + '%' OR
fieldRep.FieldRepName LIKE '%' + #SearchText + '%' OR
sch.ScheduleID LIKE '%' + #SearchText + '%' OR
window.WindowName LIKE '%' + #SearchText + '%' OR
store.StoreName LIKE '%' + #SearchText + '%'
))
ORDER BY
CASE #OrderBy2
WHEN 1 THEN sch.InstallDate
WHEN 2 THEN sch.CustomerExpectedDate
WHEN 3 THEN sch.CustomerExpectedDate
WHEN 4 THEN sch.CompletedDate
WHEN 5 THEN sch.InvoiceNumber
WHEN 6 THEN installer.InstallerName
WHEN 7 THEN customer.CustomerName
WHEN 8 THEN subdivision.SubdivisionName
WHEN 9 THEN product.ProductName
WHEN 10 THEN sch.LotNumber
WHEN 11 THEN sch.EstimateNumber
WHEN 12 THEN sch.SONumber
WHEN 13 THEN sch.ProductInStore
WHEN 14 THEN sch.ProductInStoreDate
WHEN 15 THEN sch.OrderProcessed
WHEN 16 THEN stat.StatusName
WHEN 17 THEN fieldRep.FieldRepName
WHEN 18 THEN window.WindowName
WHEN 19 THEN store.StoreName
WHEN 20 THEN driver.LastName
WHEN 21 THEN yardEmployee.LastName
ELSE sch.CustomerExpectedDate
END,
CASE #OrderBy1
WHEN 1 THEN sch.InstallDate
WHEN 2 THEN sch.CustomerExpectedDate
WHEN 3 THEN sch.CustomerExpectedDate
WHEN 4 THEN sch.CompletedDate
WHEN 5 THEN sch.InvoiceNumber
WHEN 6 THEN installer.InstallerName
WHEN 7 THEN customer.CustomerName
WHEN 8 THEN subdivision.SubdivisionName
WHEN 9 THEN product.ProductName
WHEN 10 THEN sch.LotNumber
WHEN 11 THEN sch.EstimateNumber
WHEN 12 THEN sch.SONumber
WHEN 13 THEN sch.ProductInStore
WHEN 14 THEN sch.ProductInStoreDate
WHEN 15 THEN sch.OrderProcessed
WHEN 16 THEN stat.StatusName
WHEN 17 THEN fieldRep.FieldRepName
WHEN 18 THEN window.WindowName
WHEN 19 THEN store.StoreName
WHEN 20 THEN driver.LastName
WHEN 21 THEN yardEmployee.LastName
ELSE sch.CustomerExpectedDate
END;
END;
GO
When I provide values to the dbo.GetFilteredSchedule Procedure, these are the vars I set...
I set ProductVal to "26"
I set StatusVal to "1,3,4,9999"
I set OrderBy1 and OrderBy2 to "3"
Everything else is NULL
Here's a print screen of what my table looks like...
This looks wrong:
LEFT OUTER JOIN dbo.s84_ScheduleNotes AS note
ON note.ScheduleID = (SELECT MAX(n.ScheduleNoteID) FROM dbo.s84_ScheduleNotes n WHERE n.ScheduleID = sch.ScheduleID)
I believe note.ScheduleID should be note.ScheduleNoteID

SQL query - selecting the columns whose grand total is greater than 0

Here is my SQL query:
DROP TABLE #tempi
CREATE TABLE #tempi
(
nav1 VARCHAR(50),
nav2 INT ,
nav3 INT ,
nav4 INT ,
nav5 INT
)
INSERT
INTO #tempi
SELECT COALESCE(CAST(machinename AS VARCHAR(28)), 'Grand Total:') AS machinename ,
SUM(CASE WHEN vfrm.job_id = '1001' THEN DATEDIFF(mi, 0, total_time) END) AS crate_small ,
SUM(CASE WHEN vfrm.job_id = '1002' THEN DATEDIFF(mi, 0, total_time) END) AS crate_medium ,
SUM(CASE WHEN vfrm.job_id = '1014' THEN DATEDIFF(mi, 0, total_time) END) AS front_air_deflector,
SUM(CASE WHEN vfrm.job_id = '9999' THEN DATEDIFF(mi, 0, total_time) END) AS no_schedule
FROM ven_fullreportmaster vfrm
INNER JOIN ven_descriptionmaster vdm
ON vdm.description_id = vfrm..description_id
INNER JOIN ven_machinemaster vm
ON vm.machine_id = vfrm..machine_id
WHERE vfrm.entry_date = CONVERT(VARCHAR, GETDATE()-7, 105)
--and vfrm.shift_id =1
AND vfrm.is_task_completed = 'Y'
GROUP BY machinename WITH ROLLUP
The output in tempi table:
nav1 nav2 nav3 nav4 nav5
abc 0:0 0:0 0:0 1:0
def 0:0 1:0 2:0 1:0
ghi 0:0 0:0 0:0 1:0
grand 0:0 1:0 2:0 3:0
total
I want to select the columns whose grand total is greater than 0. How to achieve it?
CREATE TABLE #tempi ( nav1 VARCHAR(50), nav2 INT, nav3 INT, nav4 INT, nav5 INT )
INSERT INTO #tempi VALUES('Grand Total:', 0.0, 1.0, 2.0, 3.0)
DECLARE #dynsql NVARCHAR(MAX)
SELECT #dynsql = ISNULL(#dynsql + ',','') + QUOTENAME(col) FROM #tempi
UNPIVOT(nav FOR col IN (nav2,nav3,nav4,nav5)) AS unpvt
WHERE nav1 = 'Grand Total:' AND nav>0
IF(##ROWCOUNT > 0)
BEGIN
SET #dynsql = 'SELECT ' + #dynsql + ' FROM #tempi'
EXEC(#dynsql)
END
DROP TABLE #tempi
Or if you can't use UNPIVOT...
DECLARE #dynsql NVARCHAR(MAX)
SELECT #dynsql = CASE WHEN nav2>0 THEN ',nav2' ELSE '' END +
CASE WHEN nav3>0 THEN ',nav3' ELSE '' END +
CASE WHEN nav4>0 THEN ',nav4' ELSE '' END +
CASE WHEN nav5>0 THEN ',nav5' ELSE '' END
FROM #tempi
WHERE nav1 = 'Grand Total:'
IF(LEN(#dynsql) > 0)
BEGIN
SET #dynsql = STUFF(#dynsql,1,1,'SELECT ') + ' FROM #tempi'
EXEC(#dynsql)
END

Using IF in SQL Function with 2 Table

I have a page like this
Baş Tar. --> Start Date
Bit. Tar --> End Date
I have a SQL like this for this page,
SELECT B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2 AS 'TEKLIF',B.MUS_K_ISIM,
dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'01/01/2011', '11/03/2011') AS 'YATAN',
(CASE WHEN B.DOVIZ_KOD = 21 THEN 'EUR' WHEN B.DOVIZ_KOD = 2 THEN 'USD' WHEN B.DOVIZ_KOD = 1 THEN 'TL' END) AS 'KUR',
D.AVUKAT,
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN
(SELECT CONVERT(VARCHAR(10),ICRA_TAR,103) FROM TAKIP WHERE T_HESAP_NO = D.HESAP)
ELSE ' ' END) AS 'ICRA TARİHİ',
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN
(SELECT CONVERT(VARCHAR(10),HACIZ_TAR,103) FROM TAKIP WHERE T_HESAP_NO = D.HESAP)
ELSE '' END) AS 'HACİZ TARİHİ'
FROM YAZ..MARDATA.S_TEKLIF B, AVUKAT D
WHERE B.HESAP_NO = D.HESAP
AND B.KAPANIS_TAR IS NULL
AND ISNULL(dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'01/01/2011', '11/03/2011'),0) > 0
GROUP BY B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,B.DOVIZ_KOD ,B.MUS_K_ISIM, D.AVUKAT, D.HESAP
And this is my dbo.fngcodeme Function,
ALTER FUNCTION [dbo].[fngcodeme]
(
#HESAP INT, #DOV INT, #TEKLIF VARCHAR(10), #BAS VARCHAR(10), #BIT VARCHAR(10)
)
RETURNS FLOAT
AS
BEGIN
DECLARE #Result FLOAT
SET #Result = (SELECT SUM(TUTAR)
FROM YAZ..MARDATA.M_GHAREKET
WHERE TEMEL_HESAP = #HESAP
AND DOVIZ_KOD = #DOV
AND REF_KOD = 'GC'
AND BACAK_GRUP = 'PERT'
AND ISL_KOD = 1
AND ACIKLAMA LIKE '%' + #TEKLIF + '%'
AND ISL_TAR >= CONVERT(DATETIME, + '' + #BAS + '',103)
AND ISL_TAR <= CONVERT(DATETIME, + '' + #BIT + '',103)
)
RETURN #Result
END
What i want is
IF `Bit. Tar. (End Date)` is less or equal then 28/02/2011 --> Use M_HAREKET(table)
IF Baş. Tar. (Start Date) is great or equal then 01/03/2011 --> Use M_GHAREKET(table)
How can i do that?
Should i change SQL or Function? Which one?
If #BAS and #BIT are dates, pass them in as dates. Don't use VARCHAR.
ALTER FUNCTION [dbo].[fngcodeme]
(
#HESAP INT, #DOV INT, #TEKLIF VARCHAR(10), #BAS datetime, #BIT datetime
)
RETURNS FLOAT
AS
BEGIN
DECLARE #Result FLOAT
IF CONVERT(DATETIME, #BIT,103) <= '20110228'
SET #Result = (SELECT SUM(TUTAR)
FROM YAZ..MARDATA.M_HAREKET
WHERE TEMEL_HESAP = #HESAP
AND DOVIZ_KOD = #DOV
AND REF_KOD = 'GC'
AND BACAK_GRUP = 'PERT'
AND ISL_KOD = 1
AND ACIKLAMA LIKE '%' + #TEKLIF + '%'
AND ISL_TAR >= CONVERT(DATETIME, #BAS,103)
AND ISL_TAR <= CONVERT(DATETIME, #BIT,103)
)
ELSE
SET #Result = (SELECT SUM(TUTAR)
FROM YAZ..MARDATA.M_GHAREKET
WHERE TEMEL_HESAP = #HESAP
AND DOVIZ_KOD = #DOV
AND REF_KOD = 'GC'
AND BACAK_GRUP = 'PERT'
AND ISL_KOD = 1
AND ACIKLAMA LIKE '%' + #TEKLIF + '%'
AND ISL_TAR >= CONVERT(DATETIME, #BAS,103)
AND ISL_TAR <= CONVERT(DATETIME, #BIT,103)
)
RETURN #Result
END
As for the calling function, don't use region specific date formats. Stick to YYYYMMDD or one of the ISO/XML ones. So your query would be
SELECT B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2 AS 'TEKLIF',B.MUS_K_ISIM,
dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'20110101', '20110311') AS 'YATAN',
......