VERY WEIRD T-SQL issue - query works but not if I encapsulate it as a sub-query to just select * from () - tsql
I have the following code which works FANTASTIC. Except - It is a sub-query to another (final) outer query and when I attempt to encapsulate this as a sub-query it refuses to run. To make it simple, I just did a "SELECT * FROM ( MY QUERY HERE)" and that even fails to run. I can only figure I am putting the right ")" in the wrong spot, but I just don't know....
Anyway - this is the query that runs fine till it is a simple sub-query:
SELECT FK_Campaign, FK_Geography, FK_InvoiceDate, FK_SalesType, FK_CustGroup, FK_Customer_Detail, FK_Parent_Detail, FK_Department, FK_Item_Detail,
FK_ItemClass_Detail, FK_ItemGroup_Detail, FK_SalesRep, FK_SalesOrigin, FK_QualityCode, FK_QualityDetailCode, FK_ResponsibilityCode,
FK_NewItemFlag, FK_TransDate, FK_CreatedDate, FK_VMReceivedDate, FK_ReturnAction, FK_StatusCode, ABC.InvoiceId, SalesID, VMRaNumber,
RetDays, ReturnQty, LineAmountmst, Qty, ReturnDays, ReturnLineAmount, ListPrice, ABC.InventTransId, ABC.ItemId,
ZZZ.FK_InventSerialProdDate AS FK_InventSerialProdDate
FROM
(SELECT
ISNULL((SELECT campaignkey --PK_Campaign
FROM VMDWAnalytical.DBO.DIM_Campaign
WHERE CampaignID = ST.smmCampaignID), -99) FK_Campaign,
ISNULL((SELECT PK_Geography
FROM VMDWAnalytical.DBO.DIM_Geography G
WHERE G.Country = ISNULL(CIJ.DLVCountryRegionID, 'zUnknown')
AND G.State = ISNULL(CIJ.DLVState, 'zUnknown')
AND G.Zip = ISNULL(CIJ.DLVZipCode, 'zUnknown')), -99) FK_Geography,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = CIJ.InvoiceDate), 1) FK_InvoiceDate,
ISNULL((SELECT PK_SalesType
FROM VMDWAnalytical.DBO.DIM_SalesType
WHERE SalesType = SL.SalesType), -99) FK_SalesType,
ISNULL((SELECT PK_CustGroup
FROM VMDWAnalytical.DBO.DIM_CustGroup
WHERE CustGroup = CT.CustGroup), -99) FK_CustGroup,
ISNULL((SELECT PK_Customer_Detail
FROM VMDWAnalytical.DBO.DIM_Customer_Detail
WHERE AccountNum = CIJ.OrderAccount), -99) FK_Customer_Detail,
ISNULL((SELECT PK_Parent_Detail
FROM VMDWAnalytical.DBO.DIM_Parent_Detail
WHERE AccountNum = CIJ.OrderAccount), -99) FK_Parent_Detail,
ISNULL((SELECT PK_Department
FROM VMDWAnalytical.DBO.DIM_Department D
WHERE D.NUM = CIT.Dimension), -99) FK_Department,
ISNULL((SELECT PK_Item_Detail
FROM VMDWAnalytical.dbo.DIM_Item_Detail
WHERE Item = IT.ItemID
AND (ConfigID = ID.ConfigID
OR ConfigID = 'NONE')), -99) FK_Item_Detail,
ISNULL((SELECT PK_ItemClass_Detail
FROM VMDWAnalytical.dbo.DIM_ItemClass_Detail
WHERE ItemID = IT.ItemID), -99) FK_ItemClass_Detail,
ISNULL((SELECT PK_ItemGroup_Detail
FROM VMDWAnalytical.dbo.DIM_ItemGroup_Detail
WHERE ItemID = IT.ItemID), -99) FK_ItemGroup_Detail,
ISNULL((SELECT PK_SalesRep
FROM VMDWAnalytical.DBO.DIM_SalesRep
WHERE SalesRep = ST.SalesResponsible), -99) FK_SalesRep,
ISNULL((SELECT PK_SalesOrigin
FROM VMDWAnalytical.DBO.DIM_SalesOrigin
WHERE OriginID = ST.SalesOriginID), -99) FK_SalesOrigin,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_QualityCode
FROM VMDWAnalytical.dbo.DIM_QualityCode
WHERE QualityCode = RR.VMQualityCode), -99)
END FK_QualityCode,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_QualityDetailCode
FROM VMDWAnalytical.dbo.DIM_QualityDetailCode
WHERE QualityDetailCode = SL.VMQualityDetailCode
AND QualityCode = RR.VMQualityCode), -99)
END FK_QualityDetailCode,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_ResponsibilityCode
FROM VMDWAnalytical.dbo.DIM_ResponsibilityCode
WHERE ResponsibilityCode = RR.VMResponsibilityCode), -99)
END FK_ResponsibilityCode,
CASE
WHEN ST.CREATEDDATE <= DATEADD(YEAR, 2, (SELECT KPISTARTDATE FROM RDS_KPIInventTableRel WHERE ITEMID = IT.ITEMID)) THEN
(SELECT PK_NEWITEMFLAG FROM VMDWAnalytical.DBO.DIM_NewItemFlag WHERE NewItemFlag = 'NEW')
ELSE
(SELECT PK_NEWITEMFLAG FROM VMDWAnalytical.DBO.DIM_NewItemFlag WHERE NewItemFlag = 'EXISTING')
END FK_NewItemFlag,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.TransDate), 1) FK_TransDate,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.CreatedDate), 1) FK_CreatedDate,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.VMReceivedDate), 1) FK_VMReceivedDate,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_ReturnAction
FROM VMDWAnalytical.dbo.DIM_ReturnAction
WHERE ReturnActionID = RR.ReturnActionID), -99)
END FK_ReturnAction,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_StatusCode
FROM VMDWAnalytical.dbo.DIM_StatusCode
WHERE StatusCode = RR.VMStatusCode), -99)
END FK_StatusCode,
ISNULL(CIT.InvoiceID, 'zUnknown') InvoiceID,
ISNULL(CIT.InventTransId, 'zUnknown') InventTransId,
ISNULL(CIT.ItemId, 'zUnknown') ItemId,
ISNULL(ST.SalesID, 'zUnknown') SalesID,
ISNULL(RR.VMRaNumber, 'zUnknown') VMRaNumber,
CASE
--A, Take out the Service item, flag with -98
WHEN IT.ITEMGROUPID = 'SERVICE' THEN
-98
--B, There is an original SO and the difference between the dates is non-negative
WHEN (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE)
--C, The last 10 characters of the refnum field start with SOR, and the orig SO date is not null and the difference between the dates is non-negative
WHEN RIGHT(ST.PURCHORDERFORMNUM, 10) LIKE 'SOR%' AND (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE)
--D, There is an original SO and the difference between the dates is negative
WHEN (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE) < 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--E, The last 10 characters of the refnum field start with SOR, and the orig SO date is not null, and the difference between the dates is negative
WHEN RIGHT(ST.PURCHORDERFORMNUM, 10) LIKE 'SOR%' AND (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE) < 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--F, If the campaign date <> 1/1/1900 and the datediff is positive
WHEN (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID) <> '1/1/1900'
AND DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--G, If the difference between the Return SO and the Return and Repair transdate is positive
WHEN DATEDIFF(DAY, ST.CREATEDDATE, RR.TRANSDATE) > 0 THEN
DATEDIFF(DAY, ST.CREATEDDATE, RR.TRANSDATE)
--H
ELSE
-97
END RETDAYS,
--RETURNS
-1 * (CASE
WHEN SL.SALESTYPE = 4 THEN
CIT.LINEAMOUNTMST
ELSE
0
END) AS ReturnLineAmount,
-1 * (CASE
WHEN SL.SALESTYPE = 4 THEN
CIT.QTY
ELSE
0
END) AS ReturnQty,
--/RETURNS
(CIT.LINEAMOUNTMST) AS LineAmountMst, --Measure
(CIT.QTY) AS Qty, --Measure
ISNULL(DATEDIFF(DAY, RR.CreatedDate, RR.TransDate), 0) ReturnDays,
ITMS.PRICE AS ListPrice --Measure
FROM RDS_CUSTINVOICETRANS CIT
LEFT JOIN RDS_CUSTINVOICEJOUR CIJ
ON CIT.INVOICEID = CIJ.INVOICEID
JOIN RDS_CUSTTABLE CT
ON CIJ.ORDERACCOUNT = CT.ACCOUNTNUM
LEFT JOIN RDS_ADDRESSCOUNTRYREGION ACR
ON CIJ.DLVCOUNTRYREGIONID = ACR.COUNTRYREGIONID
LEFT JOIN RDS_SALESTABLE ST
ON CIJ.SALESID = ST.SALESID
LEFT JOIN RDS_SALESLINE SL
ON CIT.INVENTTRANSID = SL.INVENTTRANSID
LEFT JOIN RDS_INVENTTABLE IT
ON CIT.ITEMID = IT.ITEMID
LEFT JOIN RDS_INVENTTABLEMODULE ITMS
ON IT.ITEMID = ITMS.ITEMID
AND ITMS.MODULETYPE = 2
LEFT JOIN RDS_VMRETURNANDREPAIRTABLE RR
ON SL.SALESID = RR.SALESID
AND SL.VMRANUMBER = RR.VMRANUMBER
LEFT JOIN RDS_INVENTDIM ID
ON SL.INVENTDIMID = ID.INVENTDIMID
) ABC
--WHERE SL.SALESTYPE = 4 --and (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NULL
LEFT JOIN
(SELECT CIT.InventTransId AS InventTransId, CIT.ItemId AS ItemId, CIT.InvoiceId AS InvoiceId,
ISNULL((SELECT T.TIMEKEY
FROM VMDWANAlytical.DBO.DIM_Time T
WHERE T.FullDate = MAX(SR.ProdDate)),1) AS FK_InventSerialProdDate
FROM RDS_CustInvoiceTrans CIT
LEFT JOIN RDS_InventTrans IVT
ON CIT.InventTransId = IVT.InventTransId AND
CIT.InvoiceId = IVT.InvoiceId AND
CIT.ItemId = IVT.ItemId
LEFT JOIN RDS_INVENTDIM ID
ON IVT.InventDimId = ID.InventDimId
LEFT JOIN RDS_InventSerial SR
ON ID.InventSerialId = SR.InventSerialId AND
IVT.ItemId = SR.ItemId
GROUP BY CIT.InventTransId, CIT.ItemId, CIT.InvoiceId) ZZZ
ON ABC.InventTransId = ZZZ.InventTransId AND
ABC.ItemId = ZZZ.ItemId AND
ABC.InvoiceId = ZZZ.InvoiceId
I think you need to add an alias to the subquery so you'd have
SELECT * FROM ( MY QUERY HERE) as MyQuery
Related
Split comma separated data and get its respective value from another table
I have concated data in table1 id concats sum 1 b,c 2 a,k,f,l,s 3 b,f,t 4 a,b,h,k,l,q,s,t 5 b,c,k,f,p,s 6 a,c,q,s and another table with value grade score a 4.82 b 2.65 c 2.56 d 2.75 g 6.90 h 5.90 k 6.41 f 12.80 l 2.56 p 12.80 q 1.35 s 2.90 t 5.97 I want to update table1.sum, something like b,c=(2.65+2.56=5.21) Tried the below mentioned code, but there is an error. UPDATE table1 as t1 SET sum = (SELECT (CASE WHEN (SELECT SPLIT_PART(concats,',',1) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',2) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',3) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',4) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',5) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',6) from t1) = t2.grade then t2.score ELSE 0 END) + (CASE WHEN (SELECT SPLIT_PART(concats,',',7) from t1) = t2.grade then t2.score ELSE 0 END ) + (CASE WHEN (SELECT SPLIT_PART(concats,',',8) from t1) = t2.grade then t2.score ELSE 0 END ) FROM table2 AS t2 )
You can join the two tables by converting the dreaded CSV columns to an array, then do the GROUP BY and sum on the result of that. This can be used to update the target table: update table1 set sum = x.sum_score from ( select t1.id, sum(t2.score) as sum_score from table1 t1 join table2 t2 on t2.grade = any(string_to_array(t1.concats, ',')) group by t1.id ) x where x.id = table1.id;
Combining Two Queries and Calculating Result
I am attempting to calculate the difference between query 1: select case when cnt >= 1 AND cnt <= 2000 then cnt * 6 when cnt >= 2001 AND cnt <= 4000 then ((cnt - 2000) * 5) + 12000 when cnt >= 4001 AND cnt <= 6000 then ((cnt - 4000) * 4) + 22000 when cnt >= 6001 AND cnt <= 8000 then ((cnt - 6000) * 3) + 30000 when cnt >= 8001 then ((cnt - 8000) * 2) + 36000 else 1 end "Customer Investment" from ( select COUNT(*) as cnt from "mv_fundraiser_report" where thank_you_delivered = true [[AND {{NonProfit}}]] [[AND {{StartDate}}]] ) t And Query 2: SELECT ((cast(A.TNUM as float)/cast(A.TDENOM as float))-(cast(A.FNUM as float)/cast(A.FDENOM as float)))*cast(A.TDENOM as float) AS "Heck" FROM (SELECT (SELECT SUM("public"."mv_fundraiser_report"."total_raised") FROM "public"."mv_fundraiser_report" WHERE ("public"."mv_fundraiser_report"."opt-in" = FALSE AND NOT "public"."mv_fundraiser_report"."campaign_id" = 704943916598630 AND NOT "public"."mv_fundraiser_report"."campaign_id" = 193572775319413 AND NOT(first_name IS NULL AND total_raised > 1000 AND fundraiser_type = 'Generic Fundraiser') AND [[{{NonProfit}}]] AND [[{{DateRange}}]])) AS FNUM, (SELECT count(*) AS "count" FROM "public"."mv_fundraiser_report" WHERE ("public"."mv_fundraiser_report"."opt-in" = FALSE AND NOT "public"."mv_fundraiser_report"."campaign_id" = 704943916598630 AND NOT "public"."mv_fundraiser_report"."campaign_id" = 193572775319413 AND NOT(first_name IS NULL AND total_raised > 1000 AND fundraiser_type = 'Generic Fundraiser') AND [[{{NonProfit}}]] AND [[{{DateRange}}]])) AS FDENOM, (SELECT SUM("public"."mv_fundraiser_report"."total_raised") FROM "public"."mv_fundraiser_report" WHERE ("public"."mv_fundraiser_report"."opt-in" = TRUE AND NOT "public"."mv_fundraiser_report"."campaign_id" = 704943916598630 AND NOT "public"."mv_fundraiser_report"."campaign_id" = 193572775319413 AND NOT(first_name IS NULL AND total_raised > 1000 AND fundraiser_type = 'Generic Fundraiser') AND [[{{NonProfit}}]] AND [[{{DateRange}}]])) AS TNUM, (SELECT count(*) AS "count" FROM "public"."mv_fundraiser_report" WHERE ("public"."mv_fundraiser_report"."opt-in" = TRUE AND NOT "public"."mv_fundraiser_report"."campaign_id" = 704943916598630 AND NOT "public"."mv_fundraiser_report"."campaign_id" = 193572775319413 AND NOT(first_name IS NULL AND total_raised > 1000 AND fundraiser_type = 'Generic Fundraiser') AND [[{{NonProfit}}]] AND [[{{DateRange}}]])) AS TDENOM) A Both of the queries work by themselves and return a single number, but I am struggling heavily with the syntax. I'm totally unsure of how I can make use of (window?) functions in order to achieve my end result. Any help is appreciated, thanks!
You can place each query into common table expressions, then subtract one from the other. For example (reworked query 2 for simplification): WITH one AS ( SELECT CASE WHEN cnt >= 1 AND cnt <= 2000 THEN cnt * 6 WHEN cnt >= 2001 AND cnt <= 4000 THEN ((cnt - 2000) * 5) + 12000 WHEN cnt >= 4001 AND cnt <= 6000 THEN ((cnt - 4000) * 4) + 22000 WHEN cnt >= 6001 AND cnt <= 8000 THEN ((cnt - 6000) * 3) + 30000 WHEN cnt >= 8001 THEN ((cnt - 8000) * 2) + 36000 ELSE 1 END "Customer Investment" FROM ( SELECT COUNT(*) as cnt FROM "mv_fundraiser_report" WHERE thank_you_delivered = true [[AND {{NonProfit}}]] [[AND {{StartDate}}]] ) t ), two AS ( SELECT ( ( SUM(public.mv_fundraiser_report.total_raised) FILTER (WHERE public.mv_fundraiser_report.opt-in = FALSE) )::float AS FNUM / ( count(*) FILTER (WHERE public.mv_fundraiser_report.opt-in = FALSE) )::float AS FDENOM ) - ( ( SUM(public.mv_fundraiser_report.total_raised) FILTER (WHERE public.mv_fundraiser_report.opt-in = TRUE) )::float AS TNUM / ( count(*) FILTER (WHERE public.mv_fundraiser_report.opt-in = TRUE) )::float AS TDENOM ) AS "Heck" FROM public.mv_fundraiser_report WHERE NOT public.mv_fundraiser_report.campaign_id = 704943916598630 AND NOT public.mv_fundraiser_report.campaign_id = 193572775319413 AND NOT (first_name IS NULL AND total_raised > 1000 AND fundraiser_type = 'Generic Fundraiser') AND [[{{NonProfit}}]] AND [[{{DateRange}}]]) ) SELECT one."Customer Investment" - two."Heck" AS difference FROM one, two; I don't have your data or schema to test this against, so this untested.
tsql where clause find a value from subquery's top 1 value
We have a slow query something like this: select id from task t inner join TaskLog tl on t.id = tl.id where tl.PostImage = ( select top 1 tll.PostImage from TaskLog tll where tll.id = t.id ) group by t1.PostImage, t.id It looked like the tl.PostImage = (subquery) caused the slowness. How do I rewrite this to make it run faster? EDIT: I have simplified the question in an incorrect way. Because of this the solution was not helped me. Here is the actual query I had: SELECT distinct(p.Task_id), 1 as TotalReferrals FROM Task p inner join Task_Log PL on PL.Task_ID = P.Task_ID where (MONTH(P.CreateDate) = #Month AND YEAR(P.CreateDate) = #Year) and (((p.Worker like 'k3%' and p.CreateDate < '12/6/2010') or (p.Worker in ('k22', 'k27', 'k29') and p.CreateDate >= '12/6/2010' and p.ModifiedDate < '12/1/2013') or (p.Worker in ('K4A', 'K46', 'K48') and p.CreateDate >= '12/1/2013')) or (pl.post_image = (select top 1 pll.post_image from Task_log pll where pll.Task_id = p.Task_id and pll.pre_image = 'Unknown' and pll.changed_column_nm = 'Worker' and (Month(pll.CreateDate) = #Month and Year(pll.CreateDate) = #Year) and ((pll.post_image like 'k3%' and pll.CreateDate < '12/6/2010') or (pll.post_image in ('k22', 'k27', 'k29') and pll.CreateDate >= '12/6/2010' and pll.CreateDate < '12/1/2013') or (pll.post_image in ('K4A', 'K46', 'K48') and pll.CreateDate >= '12/1/2013')) group by pll.post_image, pll.log_id ) )) group by pl.post_image, p.Task_id, pl.CreateDate
SELECT Min(T.id) FROM Task T INNER JOIN TaskLog TL ON T.id = TL.id GROUP BY TL.PostImage
You might try to erase the subselect: SELECT Distinct(P.Task_id), 1 as TotalReferrals FROM Task P INNER JOIN Task_Log PL ON PL.Task_ID = P.Task_ID WHERE (MONTH(P.CreateDate) = #Month AND YEAR(P.CreateDate) = #Year) AND (((P.Worker like 'k3%' AND P.CreateDate < '12/6/2010') OR (P.Worker in ('k22', 'k27', 'k29') AND P.CreateDate >= '12/6/2010' and P.ModifiedDate < '12/1/2013') OR (P.Worker in ('K4A', 'K46', 'K48') AND P.CreateDate >= '12/1/2013')) OR (PL.pre_image = 'Unknown' AND PL.changed_column_nm = 'Worker' AND Month(PL.CreateDate) = #Month AND Year(PL.CreateDate) = #Year AND (PL.post_image like 'k3%' AND PL.CreateDate < '12/6/2010') OR (PL.post_image in ('k22', 'k27', 'k29') AND PL.CreateDate >= '12/6/2010' AND PL.CreateDate < '12/1/2013') OR (PL.post_image in ('K4A', 'K46', 'K48') AND PL.CreateDate >= '12/1/2013')) GROUP BY PL.post_image, P.Task_id, PL.CreateDate
set value from select for few select
I have select, iside select have 2 column. This column must be filled from same select, but I don't want use select twice for it. Is it possoble use select 1 time and after that set second column value from first? Example: insert into #temptable from select a = (select aa from table1 where quantity > 5) b = (select aa from table1 where quantity > 5) I need: insert into #temptable from select a = (select aa from table1 where quantity > 5) b = {value from a} Update. I wrote bad example, I need set to BalancePrediction1 and BalancePrediction2 value from Balance INSERT #tmpBalances SELECT PA.ContractId AS 'ContractId', Con.Name AS 'ContractName', Bal.PortfolioAccountId AS 'PortfolioAccountId', PA.Name AS 'PortfolioAccountName', RA.GeneralId AS 'RegisterAccountGeneralId', Bal.BalanceTypeId AS 'BalanceTypeId', Bt.Name AS 'BalanceTypeName', Bt.Type AS 'BalanceTypeType', Bal.BalanceTimeType AS 'BalanceTimeType', Bal.InstrumentId AS 'InstrumentId', Ins.Name AS 'InstrumentName', Ins.GeneralId AS 'InstrumentGeneralId', (Bal.Balance - ( SELECT COALESCE(SUM(Mov.Amount), 0) FROM trd.Movements AS Mov WHERE Bal.InstrumentId = Mov.InstrumentId AND Bal.PortfolioAccountId = Mov.PortfolioAccountId AND Bal.BalanceTypeId = Mov.BalanceTypeId AND Bal.BalanceTimeType = Mov.BalanceTimeType AND DateDiff(DAY, #Date, Mov.Date) > 0 AND -- Currency může být null a NULL = NULL nejde COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1) ) ) as Balance, Balance AS 'BalancePrediction1', Balance AS 'BalancePrediction2', Bal.CurrencyId AS 'CurrencyId', Ccy.Code AS 'CurrencyCode', PA.PositionServiceType 'PositionServiceType', Ccy.Name 'CurrencyName', S.Nominal AS 'Nominal', S.NominalCurrencyId AS 'NominalCurrencyId', trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode' FROM trd.Balances AS Bal JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, #Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, #Date) < 0) AND S.InstrumentInstrumentTypePriceUnit = 1
You could do an update to the table variable after the insert. update #tmpBalances set BalancePrediction1 = Balance, BalancePrediction2 = Balance Or you can use cross apply to calculate the sum. INSERT #tmpBalances SELECT PA.ContractId AS 'ContractId', Con.Name AS 'ContractName', Bal.PortfolioAccountId AS 'PortfolioAccountId', PA.Name AS 'PortfolioAccountName', RA.GeneralId AS 'RegisterAccountGeneralId', Bal.BalanceTypeId AS 'BalanceTypeId', Bt.Name AS 'BalanceTypeName', Bt.Type AS 'BalanceTypeType', Bal.BalanceTimeType AS 'BalanceTimeType', Bal.InstrumentId AS 'InstrumentId', Ins.Name AS 'InstrumentName', Ins.GeneralId AS 'InstrumentGeneralId', (Bal.Balance - Mov.SumAmount) AS Balance, (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction1', (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction2', Bal.CurrencyId AS 'CurrencyId', Ccy.Code AS 'CurrencyCode', PA.PositionServiceType 'PositionServiceType', Ccy.Name 'CurrencyName', S.Nominal AS 'Nominal', S.NominalCurrencyId AS 'NominalCurrencyId', trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode' FROM trd.Balances AS Bal JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, #Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, #Date) < 0) AND S.InstrumentInstrumentTypePriceUnit = 1 CROSS APPLY (SELECT COALESCE(SUM(Mov.Amount), 0) FROM trd.Movements AS Mov WHERE Bal.InstrumentId = Mov.InstrumentId AND Bal.PortfolioAccountId = Mov.PortfolioAccountId AND Bal.BalanceTypeId = Mov.BalanceTypeId AND Bal.BalanceTimeType = Mov.BalanceTimeType AND DateDiff(DAY, #Date, Mov.Date) > 0 AND -- Currency může být null a NULL = NULL nejde COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1) ) Mov(SumAmount)
SELECT aa AS a, aa AS b FROM table1 WHERE quantity > 5
One way; ;with T (value) as ( select aa from table1 where quantity > 5 ) insert into #temptable select value, value from T
Using Subquery results as a query variable
I'm trying to make the result of one of my subqueries be used in another subquery but it doesn't work. This is the query: SELECT t.TenantName, (SELECT SUM(Amount) FROM tblTransaction WHERE Amount > 0 AND TransactionDate >= '12/01/09' AND TransactionDate <= '12/31/09' AND TenantID = t.ID AND TransactionCode = trans.TransactionCode) AmountPaid, (SELECT SUM(Amount) FROM tblTransaction WHERE tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID) - AmountPaid AmountOwedTotal, (SELECT SUM(Amount) FROM tblTransaction WHERE tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID AND Amount < 0 AND TransactionDate >= '12/01/09' AND TransactionDate <= '12/31/09') AmountOwedThisMonth, code.Description, trans.TransactionDate FROM tblTransaction trans LEFT JOIN tblTenantTransCode code ON code.ID = trans.TransactionCode LEFT JOIN tblTenant t ON t.ID = trans.TenantID WHERE trans.TransactionDate >= '12/01/09' AND trans.TransactionDate <= '12/31/09' AND trans.Amount > 0 Sorry it's so complicated. Where I do (subquery) - AmountPaid the SqlServer complains AmountPaid isn't a valid column name. How can I get access to the result of it's subquery?
SELECT TenantName, Description, TransactionDate, AmountPaid, AmountRequired - AmountPaid AS AmountOwedTotal, AmountOwedThisMonth FROM ( SELECT t.TenantName, code.Description, trans.TransactionDate, ( SELECT SUM(Amount) FROM tblTransaction WHERE Amount > 0 AND TransactionDate >= '12/01/09' AND TransactionDate <= '12/31/09' AND TenantID = t.ID AND TransactionCode = trans.TransactionCode ) AS AmountPaid, ( SELECT SUM(Amount) FROM tblTransaction WHERE tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID ) AS AmountRequired, ( SELECT SUM(Amount) FROM tblTransaction WHERE tblTransaction.TransactionCode = trans.TransactionCode AND tblTransaction.TenantID = t.ID AND Amount < 0 AND TransactionDate >= '12/01/09' AND TransactionDate <= '12/31/09' ) AS AmountOwedThisMonth, FROM tblTransaction trans LEFT JOIN tblTenantTransCode code ON code.ID = trans.TransactionCode LEFT JOIN tblTenant t ON t.ID = trans.TenantID WHERE trans.TransactionDate >= '12/01/09' AND trans.TransactionDate <= '12/31/09' AND trans.Amount > 0 ) q
try this: Select t.TenantName, c.Description, tx.TransactionDate, Sum(Case When TransactionDate Between '12/01/09' AND '12/31/09' And Amount > 0 Then tx.Amount Else 0 End) AmountPaid, Sum(tx.Amount) Total, Sum(tx.Amount) - Sum(Case When TransactionDate Between '12/01/09' AND '12/31/09' And Amount > 0 Then tx.Amount Else 0 End) AnountOwed, Sum(Case When TransactionDate Between '12/01/09' AND '12/31/09' And Amount < 0 Then tx.Amount Else 0 End) AnountOwedThisMonth FROM tblTransaction tx LEFT JOIN tblTenantTransCode c ON c.ID = tx.TransactionCode LEFT JOIN tblTenant t ON t.ID = tx.TenantID Group By t.TenantName, c.Description