我在两张桌子上进行连接。第一个表有事务,第二个表有预算。
我只想退回预算一次,但由于第一个表格中有多个交易,因此会在每个匹配的行上返回预算。
我是SQL新手,想要了解如何做到这一点?是否有一个简单的代码,或者我需要计算它返回值的次数,然后平均它?
交易数据看起来像这样
TransDate | AccountDesc | Total
1 July | Marketing | $50,000
14 July | Marketing | $10,000
3 August | Marketing | $12,500
7月营销预算为30,000美元,8月预算为80,000美元
当我进行连接时,它会返回以下结果
TransDate | AccountDesc | Total | Budget
1 July | Marketing | $50,000 | $30,000
14 July | Marketing | $10,000 | $30,000
3 August | Marketing | $12,500 | $80,000
当我把它放入Excel并做一笔款项时,它显示7月份的预算为60,000美元,而它应该只有30,000美元。
我想看到以下内容:
TransDate | AccountDesc | Total | Budget
1 July | Marketing | $50,000 | $30,000
14 July | Marketing | $10,000 |
3 August | Marketing | $12,500 | $80,000
查询如下:
SELECT GLTrans.OPENYEAR as FinYear
, RTRIM(GLTrans.REFRENCE) AS Reference
, RTRIM(GLTrans.DSCRIPTN) AS Description
, GLTrans.TRXDATE
,
CASE
WHEN MONTH(GLTrans.TRXDATE) = 1 THEN '07 January'
WHEN MONTH(GLTrans.TRXDATE) = 2 THEN '08 February'
WHEN MONTH(GLTrans.TRXDATE) = 3 THEN '09 March'
WHEN MONTH(GLTrans.TRXDATE) = 4 THEN '10 April'
WHEN MONTH(GLTrans.TRXDATE) = 5 THEN '11 May'
WHEN MONTH(GLTrans.TRXDATE) = 6 THEN '12 June'
WHEN MONTH(GLTrans.TRXDATE) = 7 THEN '01 July'
WHEN MONTH(GLTrans.TRXDATE) = 8 THEN '02 August'
WHEN MONTH(GLTrans.TRXDATE) = 9 THEN '03 September'
WHEN MONTH(GLTrans.TRXDATE) = 10 THEN '04 October'
WHEN MONTH(GLTrans.TRXDATE) = 11 THEN '05 November'
ELSE '06 December'
END AS TransDate
, SUM(GLTrans.CRDTAMNT) * -1 AS Credit
, GLTrans.DEBITAMT AS Debit
, GLTrans.DEBITAMT - GLTrans.CRDTAMNT AS Total
,
CASE
WHEN GLCode.ACTNUMBR_1 = 6238 THEN 'Subscriptions'
WHEN GLCode.ACTNUMBR_1 = 6212 THEN 'Conference Expenses'
WHEN GLCode.ACTNUMBR_1 = 6216 THEN 'Entertainment - Business Development'
WHEN GLCode.ACTNUMBR_1 = 6217 THEN 'Entertainment -Staff Engagement'
WHEN GLCode.ACTNUMBR_1 = 6250 THEN 'Marketing & Promotion'
WHEN GLCode.ACTNUMBR_1 = 6265 THEN 'Staff Awards'
WHEN GLCode.ACTNUMBR_1 = 6270 THEN 'Staff Training'
WHEN GLCode.ACTNUMBR_1 = 6272 THEN 'Travelling'
WHEN GLCode.ACTNUMBR_1 = 6268 THEN 'Technical Publications'
WHEN GLCode.ACTNUMBR_1 = 6237 THEN 'Legels Fees'
WHEN GLCode.ACTNUMBR_1 = 6262 THEN 'Staff Hiring Costs'
ELSE 'General Expenses'
END AS AccountDesc
, RTRIM(GLCode.ACTNUMST) AS AccountNum
, GLCode.ACTNUMBR_2 AS ServiceLine
, GLCode.ACTNUMBR_4 AS Partner
, GLTrans.DEX_ROW_ID
FROM GL20000 As GLTrans
LEFT JOIN GL00105 AS GLCode ON GLCode.ACTINDX = GLTrans.ACTINDX
LEFT JOIN (
SELECT [BUDGETID]
,RTRIM([ACTNUMBR_1]) + '-' + RTRIM([ACTNUMBR_2]) + '-' + RTRIM([ACTNUMBR_3]) + '-' + RTRIM([ACTNUMBR_4]) AS Account
,[PERIODDT]
,[PERIODID]
,[BUDGETAMT]
,[ACCATNUM]
,[ACTINDX]
,[YEAR1]
FROM [GPSRV].[dbo].[GL00201]
WHERE BUDGETID = '2016 BUDGET'
AND [ACTNUMBR_1] IN ('6238', '6212', '6216', '6217', '6250', '6265', '6270', '6272', '6268', '6237', '6262', '6213', '6214', '6215')
AND ACTNUMBR_2 IN ('RAS', 'BRI', 'COR')
) AS Budget on Budget.Account = GLCode.ACTNUMST
WHERE GLCode.ACTNUMBR_1 IN ('6238', '6212', '6216', '6217', '6250', '6265', '6270', '6272', '6268', '6237', '6262', '6213', '6214', '6215')
AND GLCode.ACTNUMBR_2 IN ('RAS', 'BRI', 'COR')
and GLTrans.TRXDATE >= '2015-07-01 00:00:00.000'
AND GLTrans.TRXDATE <= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)
GROUP BY
GLTrans.OPENYEAR
, GLTrans.REFRENCE
, GLTrans.DSCRIPTN
, GLTrans.TRXDATE
, GLTrans.DEBITAMT
, GLCode.ACTNUMST
, GLCode.ACTNUMBR_1
, GLCode.ACTNUMBR_2
, GLCode.ACTNUMBR_4
, GLTrans.TRXDATE
, GLTrans.DEBITAMT
, GLTrans.CRDTAMNT
, GLTrans.DEX_ROW_ID
两张桌子之间的关系非常有限。首先,如果我提供任何其他帮助,我将与Microsoft GP合作。
交易表有
财政年度。
交易日期。
总帐代码(代码,位置,部门,合作伙伴)
预算表有 预算ID 总帐中的总帐代码(代码,位置,部门,合作伙伴) 期间ID(财务月份) 预算金额
否则没有任何东西可以加入。
再次感谢
答案 0 :(得分:0)
我在这里猜测相当多,所提供的代码示例在问题的上下文中对我没有多大意义。但希望这将是一个起点。如果您可以提供有关联接如何工作的一些说明,我将很乐意添加/修改此内容。
SELECT
GLTrans.OPENYEAR as [FinYear],
rtrim(GLTrans.REFRENCE) as [Reference],
rtrim(GLTrans.DSCRIPTN) as [Description],
GLTrans.TRXDATE,
right('0' + cast(month(dateadd(m, 6, GLTrans.TRXDATE)) as char(2)),2) + ' ' + datename(m, GLTrans.TRXDATE) as [TransDate],
sum(GLTrans.CRDTAMNT) * -1 as [Credit],
GLTrans.DEBITAMT as [Debit],
GLTrans.DEBITAMT - GLTrans.CRDTAMNT as [Total],
CASE GLCode.ACTNUMBR_1
WHEN 6238 THEN 'Subscriptions'
WHEN 6212 THEN 'Conference Expenses'
WHEN 6216 THEN 'Entertainment - Business Development'
WHEN 6217 THEN 'Entertainment -Staff Engagement'
WHEN 6250 THEN 'Marketing & Promotion'
WHEN 6265 THEN 'Staff Awards'
WHEN 6270 THEN 'Staff Training'
WHEN 6272 THEN 'Travelling'
WHEN 6268 THEN 'Technical Publications'
WHEN 6237 THEN 'Legels Fees'
WHEN 6262 THEN 'Staff Hiring Costs'
ELSE 'General Expenses'
END AS [AccountDesc],
rtrim(GLCode.ACTNUMST) as [AccountNum],
GLCode.ACTNUMBR_2 as [ServiceLine],
GLCode.ACTNUMBR_4 as [Partner],
sum(Budget.BUDGETAMT) over (partition by rtrim(GLCode.ACTNUMST)) as [Budget]
FROM
GL20000 as GLTrans
LEFT JOIN GL00105 as GLCode on GLCode.ACTINDX = GLTrans.ACTINDX
LEFT JOIN GL00201 as Budget on (rtrim(Budget.ACTNUMBR_1) + '-' + rtrim(Budget.ACTNUMBR_2) + '-' + rtrim(Budget.ACTNUMBR_3) + '-' + rtrim(Budget.ACTNUMBR_4)) = rtrim(GLCode.ACTNUMST)
and Budget.BUDGETID = '2016 BUDGET'
and Budget.ACTNUMBR_1 in ('6238', '6212', '6216', '6217', '6250', '6265', '6270', '6272', '6268', '6237', '6262', '6213', '6214', '6215')
and Budget.ACTNUMBR_2 in ('RAS', 'BRI', 'COR')
WHERE
GLCode.ACTNUMBR_1 in ('6238', '6212', '6216', '6217', '6250', '6265', '6270', '6272', '6268', '6237', '6262', '6213', '6214', '6215')
and GLCode.ACTNUMBR_2 in ('RAS', 'BRI', 'COR')
and GLTrans.TRXDATE >= '2015-07-01 00:00:00.000'
and GLTrans.TRXDATE <= dateadd(mm, datediff(mm, 0, getdate()), 0)
GROUP BY
GLTrans.OPENYEAR, GLTrans.REFRENCE, GLTrans.DSCRIPTN, GLTrans.TRXDATE, GLTrans.DEBITAMT,
GLCode.ACTNUMST, GLCode.ACTNUMBR_1, GLCode.ACTNUMBR_2, GLCode.ACTNUMBR_4, GLTrans.TRXDATE,
GLTrans.DEBITAMT, GLTrans.CRDTAMNT, GLTrans.DEX_ROW_ID
我对格式采取了一些自由,我发现这种方式更容易阅读。我所做的改变包括:
SELECT TOP 1000
,我不确定是否需要)。我不确定您的预算表和交易表之间的关系。sum(column) over (partition by another_column)
,类似于Excel在数据透视表中提供小计的方式。您能提供一些示例数据,以便我们更好地了解您的表格之间的关系吗?如果你将它们放在{code blocks}
中,它们很容易用固定的字符宽度格式化,如下所示:
Table 1:
| Column_1 | Column_2 | Column_3 |
|-----------|-----------------|-----------|
| some data | some other data | more data |
| etc | second row | stuff |
<强>更新强>
因此,查看您想要的结果,实际上可能更容易在Excel中而不是在SQL查询中解决此问题。它可以在SQL中完成,但它会复杂得多,要求ROW_NUMBER
,CASE
和ORDER BY
的CTE只需指定要包含预算数字的行,并且您想要返回null
值。
如果您坚持使用现有输出(假设您当前将其放在A列到D列中),那么您可以将此公式放在E2中并将其向下拖动以自动填充以下行:
=IF(MID(A2,IFERROR(FIND(" ",A2)+1,1),3)<>MID(A1,IFERROR(FIND(" ",A1)+1,1),3),D2,"")
这可能看起来很复杂,但它确实是一个非常简单的真/假比较。 FIND
函数查找A1 / A2中第一个空格的字符位置,(IFERROR
是否在没有找到空格的情况下返回默认值1),然后MID
函数从该字符位置开始,并返回右边的下3个字符('Jul','Aug'等)。整个过程执行两次 - 一次用于当前行,一次用于前一行。如果值不同,则表示月份已更改,因此返回预算列(D)中的相应值,如果值相同,则月份尚未进展,因此返回空白。您可以通过此列获得数据透视表总和,它应该可以正常工作,因为每个月只有一行具有从D列复制的预算值。