Sql server 钕 ) 选择[UnconfirmedCount]=(isnull(s.[count],0)+t.[count]),[UnconfirmedValue]=isnull(s.[value],0)+t.[value] ,buyerID=如果s.buyerID不为null,则s.buyerID else t.buyerID结束 从s 右连接(值(0,0,'Person1')、(0,0,'Person2')、(0,0,'Person3')、(0,0,'Person4'))T([Count]、[Value]、[BuyerID]) 关于s.BuyerID=t.BuyerID
忘记Sql server 钕 ) 选择[UnconfirmedCount]=(isnull(s.[count],0)+t.[count]),[UnconfirmedValue]=isnull(s.[value],0)+t.[value] ,buyerID=如果s.buyerID不为null,则s.buyerID else t.buyerID结束 从s 右连接(值(0,0,'Person1')、(0,0,'Person2')、(0,0,'Person3')、(0,0,'Person4'))T([Count]、[Value]、[BuyerID]) 关于s.BuyerID=t.BuyerID,sql-server,tsql,Sql Server,Tsql,忘记分组依据中的案例。我认为这不管用。如果您需要将“Person5”映射到“Person4”,那么可以使用表和联接来实现 为什么将PODetail作为d?你没有使用它 SELECT COUNT(DISTINCT h.PONum) AS unconfirmedCount, SUM(ISNULL(d.DocExtCost, 0)) AS unconfirmedValue, v.Buyer_c from [Dbo].Vendor AS v
分组依据中的案例
。我认为这不管用。如果您需要将“Person5”映射到“Person4”,那么可以使用表和联接来实现
为什么将PODetail作为d?你没有使用它
SELECT COUNT(DISTINCT h.PONum) AS unconfirmedCount,
SUM(ISNULL(d.DocExtCost, 0)) AS unconfirmedValue,
v.Buyer_c
from [Dbo].Vendor AS v
left join [Dbo].POHeader AS h
ON h.Company = v.Company
AND h.VendorNum = v.VendorNum
and h.FirstPublishedToPortal_c < DATEADD(HOUR, 24, GETDATE())
AND h.ReadyForSupplierPortal_c = 1
AND isnull(h.Confirmed, 0) = 0
left JOIN [Dbo].PODetail AS d
ON d.Company = h.Company
and d.PONum = h.PONum
WHERE v.Buyer_c IN ('Person1', 'Person2', 'Person3', 'Person4', 'Person5')
GROUP BY v.Buyer_c
选择计数(不同h.PONum)作为未确认计数,
作为未确认值的总和(ISNULL(d.DocExtCost,0)),
v、 买方
来自[Dbo]。供应商为v
左联接[Dbo]。POH头作为h
关于h公司=v公司
而h.VendorNum=v.VendorNum
和h.FirstPublishedToPortal_c
忘记分组依据中的案例
。我认为这不管用。如果您需要将“Person5”映射到“Person4”,那么可以使用表和联接来实现
为什么将PODetail作为d?你没有使用它
SELECT COUNT(DISTINCT h.PONum) AS unconfirmedCount,
SUM(ISNULL(d.DocExtCost, 0)) AS unconfirmedValue,
v.Buyer_c
from [Dbo].Vendor AS v
left join [Dbo].POHeader AS h
ON h.Company = v.Company
AND h.VendorNum = v.VendorNum
and h.FirstPublishedToPortal_c < DATEADD(HOUR, 24, GETDATE())
AND h.ReadyForSupplierPortal_c = 1
AND isnull(h.Confirmed, 0) = 0
left JOIN [Dbo].PODetail AS d
ON d.Company = h.Company
and d.PONum = h.PONum
WHERE v.Buyer_c IN ('Person1', 'Person2', 'Person3', 'Person4', 'Person5')
GROUP BY v.Buyer_c
选择计数(不同h.PONum)作为未确认计数,
作为未确认值的总和(ISNULL(d.DocExtCost,0)),
v、 买方
来自[Dbo]。供应商为v
左联接[Dbo]。POH头作为h
关于h公司=v公司
而h.VendorNum=v.VendorNum
和h.FirstPublishedToPortal_c
使用CTE(通用表格表达式):
使用CTE(通用表表达式):
我想说的是左路加入法我想说的是左路加入法我不相信group by是有效的。我测试了一个简单的案例,它不会抛出语法错误,但不会执行。变量group by有什么意义?group by和case实际上都在工作。原因是,第4人和第5人实际上是同一个人在不同的BuyerID下输入订单(出于某些业务目的)。但是管理层希望这份总结报告将他们所有的努力都包含在一个结果中,而不是两行,因此需要将他们的结果分组在一起。我不相信分组方式是有效的。我测试了一个简单的案例,它不会抛出语法错误,但不会执行。变量group by有什么意义?group by和case实际上都在工作。原因是,第4人和第5人实际上是同一个人在不同的BuyerID下输入订单(出于某些业务目的)。但是mgmt希望这份总结报告将他们所有的努力都包含在一个结果中,而不是两行,因此需要将他们的结果分组在一起。这很有效,但我完全不理解它是如何工作的。这是什么:;使用s([Count]、[Value]、buyerID)作为
do?@s.Mason,这就是所谓的公共表表达式(缩写为CTE),详细来说,您可以看到它工作得很好,但我完全不理解它是如何工作的。这是什么:;使用s([Count]、[Value]、buyerID)作为
do?@s.Mason,这被称为公共表表达式(缩写为CTE),有关详细信息,您可以看到
create table #s ([Count] int, [Value] int, [BuyerID] varchar(10))
insert into #s values (1, 250, 'Person1'), (1, 285, 'Person2'), (1, 1560, 'Person3')
select [UnconfirmedCount]=(isnull(s.[count],0)+ t.[count])
, [UnconfirmedValue]=isnull(s.[value],0)+t.[value],
, buyerID = case when s.BuyerID is not null then s.BuyerID else t.BuyerID end
from #s s
right join (values (0, 0, 'Person1'), (0, 0, 'Person2'), (0, 0, 'Person3'), (0, 0, 'Person4')) T([Count], [Value], [BuyerID] )
on s.BuyerID = t.BuyerID
; with s ([Count], [Value], buyerID) as
(
SELECT COUNT(DISTINCT h.PONum) AS unconfirmedCount,
ISNULL(SUM(d.DocExtCost), 0) AS unconfirmedValue,
CASE v.Buyer_c
WHEN 'Person5' THEN 'Person4'
ELSE v.Buyer_c
END AS buyerID
FROM [Dbo].POHeader AS h
INNER JOIN [Dbo].PODetail AS d
ON (h.Company = d.Company AND
h.PONum = d.PONum)
INNER JOIN [Dbo].Vendor AS v
ON (h.Company = v.Company AND
h.VendorNum = v.VendorNum)
WHERE h.FirstPublishedToPortal_c < DATEADD(HOUR, 24, GETDATE())
AND v.Buyer_c IN ('Person1', 'Person2', 'Person3', 'Person4', 'Person5')
AND h.ReadyForSupplierPortal_c = 1
AND ( h.Confirmed = 0 OR h.Confirmed IS NULL )
GROUP BY CASE v.Buyer_c
WHEN 'Person5' THEN 'Person4'
ELSE v.Buyer_c
END
)
select [UnconfirmedCount]=(isnull(s.[count],0)+ t.[count]), [UnconfirmedValue]=isnull(s.[value],0)+t.[value]
, buyerID = case when s.BuyerID is not null then s.BuyerID else t.BuyerID end
from s
right join (values (0, 0, 'Person1'), (0, 0, 'Person2'), (0, 0, 'Person3'), (0, 0, 'Person4')) T([Count], [Value], [BuyerID] )
on s.BuyerID = t.BuyerID
SELECT COUNT(DISTINCT h.PONum) AS unconfirmedCount,
SUM(ISNULL(d.DocExtCost, 0)) AS unconfirmedValue,
v.Buyer_c
from [Dbo].Vendor AS v
left join [Dbo].POHeader AS h
ON h.Company = v.Company
AND h.VendorNum = v.VendorNum
and h.FirstPublishedToPortal_c < DATEADD(HOUR, 24, GETDATE())
AND h.ReadyForSupplierPortal_c = 1
AND isnull(h.Confirmed, 0) = 0
left JOIN [Dbo].PODetail AS d
ON d.Company = h.Company
and d.PONum = h.PONum
WHERE v.Buyer_c IN ('Person1', 'Person2', 'Person3', 'Person4', 'Person5')
GROUP BY v.Buyer_c
;With buyers AS (BuyerId)
(
-- Select Distinct BuyerID
),
unconfirmedCounts AS (UnconfirmedCount, UnconfirmedValue, BuyerId)
(
-- Select Counts & Value for each Buyer where available
)
Select ISNULL(u.UnconfirmedCount,0) AS UnconfirmedCount,
ISNULL(u.UnconfirmedValue,0) AS UnconfirmedValue,
b.BuyerId as BuyerId
FROM buyers b
LEFT JOIN unconfirmedCounts u on b.BuyerId = u.BuyerId;