Sql 使用不同的条件调用列两次
我非常感谢在这件事上的任何帮助:) 我现在正在写一份报告,我遇到了一些麻烦 我有这个查询,它工作得很好,现在我想添加一个已经存在于查询中的coulmn(来自同一个表),但这次我将更改它的条件,顺便说一句,这两列中的条件都基于另一列 例如,如果我有这样一个:Sql 使用不同的条件调用列两次,sql,sql-server,join,union,Sql,Sql Server,Join,Union,我非常感谢在这件事上的任何帮助:) 我现在正在写一份报告,我遇到了一些麻烦 我有这个查询,它工作得很好,现在我想添加一个已经存在于查询中的coulmn(来自同一个表),但这次我将更改它的条件,顺便说一句,这两列中的条件都基于另一列 例如,如果我有这样一个: Select Price from ITM1 WHERE PriceList = '1' 还有这个 Select Price from ITM1 WHERE PriceList = '10' 如何在同一个查询中编写并让它们显示在两个不同的
Select Price from ITM1 WHERE PriceList = '1'
还有这个
Select Price from ITM1 WHERE PriceList = '10'
如何在同一个查询中编写并让它们显示在两个不同的列中?
如果有人能帮我解决这个问题,我会把这个问题放在这里:
您可以在它的下半部分看到Price&PriceList列,粗体。
我只需要再做一次同样的事情,但要有一个新的coulmn名称,就是这样。使用会给你想要的。但是,您可以对查询进行其他更改,以提高性能,但这超出了问题的范围。我不清楚你想用不同的“栏目”做什么,请帮忙解释一下否则请参见@Dave.Gugg的答案,答案正好如此。
SELECT T0.ItemCode,
T0.ItemName,
T0.CardCode,
T0.CodeBars,
T2.UgpCode,
T3.AltQty,
T3.BaseQty,
CASE
WHEN T4.Uomentry = - 1
THEN T0.[BuyUnitMsr]
ELSE t4.UomName
END AS 'UoMName',
T4.UomEntry,
T0.U_CAT_CODE,
T0.U_CAT_NAME,
T1.CardName,
(
SELECT TOP (1) dbo.PDN1.U_AC_QTY_ORDER
FROM dbo.PDN1
INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
WHERE (dbo.PDN1.ItemCode = T0.ItemCode)
AND (dbo.OPDN.CardCode = T0.CardCode)
ORDER BY dbo.OPDN.DocDate DESC
) AS OQuantity,
(
SELECT TOP (1) PDN1_1.U_AC_QTY_BONUS
FROM dbo.PDN1 AS PDN1_1
INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
WHERE (PDN1_1.ItemCode = T0.ItemCode)
AND (OPDN_1.CardCode = T0.CardCode)
ORDER BY OPDN_1.DocDate DESC
) AS BQuantity,
ITM1.Price,
T0.U_DISC_PER
FROM dbo.OITM AS T0
INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
INNER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
AND dbo.ITM1.PriceList IN ('1', '10')
LEFT JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE (T0.Series = '65')
AND (
T4.UomEntry = 3
OR T4.UomEntry = '-1'
)
如果需要不同的列(这可能比两个联接执行得更好):
您应该能够再次连接到表,但需要将连接设置为外部:
SELECT T0.ItemCode ,
T0.ItemName ,
T0.CardCode ,
T0.CodeBars ,
T2.UgpCode ,
T3.AltQty ,
T3.BaseQty ,
CASE WHEN T4.Uomentry = -1 THEN T0.[BuyUnitMsr]
ELSE t4.UomName
END AS 'UoMName' ,
T4.UomEntry ,
T0.U_CAT_CODE ,
T0.U_CAT_NAME ,
T1.CardName ,
( SELECT TOP ( 1 )
dbo.PDN1.U_AC_QTY_ORDER
FROM dbo.PDN1
INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
WHERE ( dbo.PDN1.ItemCode = T0.ItemCode )
AND ( dbo.OPDN.CardCode = T0.CardCode )
ORDER BY dbo.OPDN.DocDate DESC
) AS OQuantity ,
( SELECT TOP ( 1 )
PDN1_1.U_AC_QTY_BONUS
FROM dbo.PDN1 AS PDN1_1
INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
WHERE ( PDN1_1.ItemCode = T0.ItemCode )
AND ( OPDN_1.CardCode = T0.CardCode )
ORDER BY OPDN_1.DocDate DESC
) AS BQuantity ,
dbo.ITM1.Price ,
ITM1Second.Price,
T0.U_DISC_PER
FROM dbo.OITM AS T0
INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
LEFT OUTER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
AND dbo.ITM1.PriceList = '10'
LEFT OUTER JOIN dbo.ITM1 ITM1Second ON T0.ItemCode = ITM1Second.ItemCode
AND ITM1Second.PriceList = '1'
LEFT OUTER JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE ( T0.Series = '65' )
AND ( T4.UomEntry = 3
OR T4.UomEntry = '-1'
)
为什么在您的示例中,
案例
表达式不起作用?还是我误解了这个问题?1 thanx 4你的回答,2,我在这方面还是新的,我在这里贴了太多东西,总是有错误,如果你能用一个例子或方法指导我,我将非常感谢你不能添加一个这样的专栏。当Pricelist=1时,你应该使用select case,然后Pricelist以'Column1'结尾,同样的,但以=10作为'column2',我会尝试@Damiea,thxI更像Dan Andrew的答案,这个答案会运行得慢很多,可能会产生不好的结果。这取决于他在做什么。你的答案是正确的,这取决于你对问题的理解:)亲爱的@Dave.Gugg我无法感谢你,无论我怎么努力,你刚刚救了我一天:)我将以此作为我的开始:)亲爱的Dan Andrews thax这么多4你的回答:)只有一个价格显示,另一个显示为0,或者说是Oppersite,在现实中,PriceList='10,Pricelt='1'它们都存储有数据,所以每个coulmn都必须显示它自己的价格,另一个问题是,在相同的ItemCode中发生了一些复制,但在每个具有不同值的行中,我将在Crestal Report中使用查询,我现在正试图解决这个问题,希望我能在一天结束时这样做:)再次感谢你的帮助你好Dan Andrews,我只想再次感谢你你和每个人都回答了这个问题,你今天的快速反应救了我,并且没有在我的管理层和客户面前感到尴尬,因为我对我帮助太多的第一个项目还很新鲜,客户要求我做更多的更改,因为我了解了您对查询所做的更改,我想将此作为私人信息发送给您,但我认为网站没有提供此信息。:)
SELECT T0.ItemCode ,
T0.ItemName ,
T0.CardCode ,
T0.CodeBars ,
T2.UgpCode ,
T3.AltQty ,
T3.BaseQty ,
CASE WHEN T4.Uomentry = -1 THEN T0.[BuyUnitMsr]
ELSE t4.UomName
END AS 'UoMName' ,
T4.UomEntry ,
T0.U_CAT_CODE ,
T0.U_CAT_NAME ,
T1.CardName ,
( SELECT TOP ( 1 )
dbo.PDN1.U_AC_QTY_ORDER
FROM dbo.PDN1
INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
WHERE ( dbo.PDN1.ItemCode = T0.ItemCode )
AND ( dbo.OPDN.CardCode = T0.CardCode )
ORDER BY dbo.OPDN.DocDate DESC
) AS OQuantity ,
( SELECT TOP ( 1 )
PDN1_1.U_AC_QTY_BONUS
FROM dbo.PDN1 AS PDN1_1
INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
WHERE ( PDN1_1.ItemCode = T0.ItemCode )
AND ( OPDN_1.CardCode = T0.CardCode )
ORDER BY OPDN_1.DocDate DESC
) AS BQuantity ,
dbo.ITM1.Price ,
ITM1Second.Price,
T0.U_DISC_PER
FROM dbo.OITM AS T0
INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
LEFT OUTER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
AND dbo.ITM1.PriceList = '10'
LEFT OUTER JOIN dbo.ITM1 ITM1Second ON T0.ItemCode = ITM1Second.ItemCode
AND ITM1Second.PriceList = '1'
LEFT OUTER JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE ( T0.Series = '65' )
AND ( T4.UomEntry = 3
OR T4.UomEntry = '-1'
)