我是SQL新手,我试图从分类帐表中查询 我有两个查询需要加入一个表
第一次查询:
SELECT *
FROM TABLE 1
WHERE DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3
AND [ITEMTYPE] = 'F-C'
AND ([Description] NOT LIKE '%REFILE%'
AND [Description] NOT LIKE '%CROSSOVER%')
AND ([UserNAME] LIKE '%USER1%'
OR [UserNAME] LIKE '%user2%'
OR [UserNAME] LIKE '%user3%')
第二次质疑:
SELECT [ENCID], SUM([Trans]) AS Total_Charges
FROM Table 1
WHERE DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3
AND [ITEMTYPE] IN ('C')
GROUP BY [ENCID];
我需要将第二个查询连接到ENCID上的第一个查询
感谢。
答案 0 :(得分:0)
好吧,你加入吧。没什么特别的,除了你必须记得给别名,例如Totals
我还将DATEDIFF(MONTH, [Transaction Date], GETDATE()) <= 3
更改为[Transaction Date] >= DATEADD(MONTH, -3, GETDATE())
,以允许SQL Server在[Transaction Date]列上使用索引(如果有的话)。
还引导通配符文本搜索,例如[UserNAME] LIKE '%user2%'
很慢,如果可以的话,请避开它们:https://sqlperformance.com/2017/02/sql-indexes/seek-leading-wildcard-sql-server
SELECT *
FROM TABLE 1 AS a
LEFT JOIN
( SELECT [ENCID], SUM([Trans]) AS Total_Charges
FROM Table 1
WHERE [Transaction Date] >= DATEADD(MONTH, -3, GETDATE())
AND [ITEMTYPE] IN ('C')
GROUP BY [ENCID] ) AS Totals ON Totals.[ENCID] = a.[ENCID]
WHERE
[Transaction Date] >= DATEADD(MONTH, -3, GETDATE())
AND [ITEMTYPE] = 'F-C'
AND ([Description] NOT LIKE '%REFILE%'
AND [Description] NOT LIKE '%CROSSOVER%')
AND ([UserNAME] LIKE '%USER1%'
OR [UserNAME] LIKE '%user2%'
OR [UserNAME] LIKE '%user3%')
答案 1 :(得分:0)
当您引入任何联接(对表或子查询)时,通过别名引用这些来源的列是至关重要的。
SELECT t1.*
FROM TABLE_1 t1
LEFT JOIN (
SELECT [ENCID], SUM([Trans]) AS Total_Charges
FROM Table_1
WHERE [Transaction Date] >= DATEADD(month,-3,GETDATE())
AND [ITEMTYPE] IN ('C')
GROUP BY [ENCID]
) sq ON t1.[ENCID] = sq.[ENCID]
WHERE t1.[Transaction Date] >= DATEADD(month,-3,GETDATE())
AND t1.[ITEMTYPE] = 'F-C'
AND (t1.[Description] NOT LIKE '%REFILE%'
AND t1.[Description] NOT LIKE '%CROSSOVER%')
AND (t1.[UserNAME] LIKE '%USER1%'
OR t1.[UserNAME] LIKE '%user2%'
OR t1.[UserNAME] LIKE '%user3%')
注意:我已经改变了考虑日期的方式,以便可以使用[交易日期]上的索引。而不是计算每一行的月数,计算日期然后将现有数据与该值进行比较要高效得多。为了获得最佳性能,请尝试避免在where子句中使用数据函数。