两个查询合并(SQL)
我有两个问题,但我不知道如何合并它们。我正在努力实现插入到列表中的最新价格 第一个是:两个查询合并(SQL),sql,tsql,Sql,Tsql,我有两个问题,但我不知道如何合并它们。我正在努力实现插入到列表中的最新价格 第一个是: SELECT ITM.CODE ,itm.NAME ,min(isnull(price,0)) [min price] ,max(isnull(price,0)) [max] ,SUM(total)/SUM(amount) as [avr] FROM LG_092_ITEMS ITM INNER JOIN LG_092_01_STLINE STL
SELECT
ITM.CODE
,itm.NAME
,min(isnull(price,0)) [min price]
,max(isnull(price,0)) [max]
,SUM(total)/SUM(amount) as [avr]
FROM LG_092_ITEMS ITM
INNER JOIN LG_092_01_STLINE STL
ON ITM.LOGICALREF = STL.STOCKREF
WHERE PRICE > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
GROUP BY ITM.name , itm.code
ORDER BY code
第二个是:
SELECT
ITM.CODE, itm.NAME, max (stl.date_) [latest date] , price as [latest price]
FROM LG_092_ITEMS ITM
INNER JOIN LG_092_01_STLINE STL
ON ITM.LOGICALREF = STL.STOCKREF
WHERE PRICE > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
group by code, name, stl.DATE_ , price
您要查找的关键字是
JOIN
UNION子句将合并两个查询,只保留唯一的值。不是最优雅的,但我认为它会起作用:) 有关CTE的更多信息,请参阅:
当价格>0时,您不需要isnull我们在我朋友的帮助下找到了另一种方法。。。希望这对其他人也有帮助
SELECT ITM.CODE
,itm.NAME
,min(isnull(STL.price, 0)) [min price]
,max(isnull(STL.price, 0)) [max]
,SUM(total) / SUM(amount) AS [avr]
--SON SATINALMA FIYATI
,ISNULL((SELECT TOP 1 PRC.PRICE FROM LG_092_01_STLINE AS PRC
WHERE PRC.STOCKREF = ITM.LOGICALREF
AND PRC.PRICE > 0
AND PRC.TRCODE = 1
AND PRC.CANCELLED = 0
AND PRC.INVOICEREF > 0
ORDER BY PRC.DATE_ DESC), 0) AS latestprice
FROM LG_092_ITEMS AS ITM
INNER JOIN LG_092_01_STLINE AS STL ON ITM.LOGICALREF = STL.STOCKREF
WHERE STL.PRICE > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
GROUP BY ITM.LOGICALREF, ITM.CODE, ITM.NAME
ORDER BY ITM.CODE
这可能是一条评论,op正在寻找SQLServer谢谢语言提示。在未指定语言的情况下编写了答案,但应该编写Oracle链接只是一个示例引用。我想先发表评论,但后来我认为“使用连接”是“如何合并?”的答案,所以我将我的答案作为答案发布。不鼓励这种行为吗?答案通常是解决OP问题的完整答案。评论用于链接到有用信息和其他问题。我认为在这个例子中很明显,OP知道如何根据提供的示例查询进行连接,并在select?Msg 156的15级状态1的第2行中使用不同数量的列,关键字“FROM”附近的语法不正确。Msg 156,级别15,状态1,第12行关键字“GROUP”附近的语法不正确。第二个查询有效吗?请提供表的结构和一些示例数据?@UmutK:请检查如何更快地请求和获得帮助:亲爱的@TheGameiswar,您是正确的,查询应如下。在ITM1.LOGICALREF=stl.STOCKREF上选择ITM1.CODE、ITM1.NAME、max(stl.date_uu2;)[最新日期],从LG_092_项目ITM1内部连接LG_092_01_2;STLINE stl中选择[最新价格],其中价格>0,TRCODE=1,取消=0,发票参考>0按代码、名称、stl.date分组,价格谢谢您的时间,但不工作。。。Msg 8120,级别16,状态1,第5行“LG_092_01_STLINE.PRICE”列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。还有其他建议吗@m-grueJust是一个不需要的小组:)工作起来很有魅力!谢谢!我的另一个问题是,我不能使用以“with”开头的查询和“union all”一起使用任何建议?只需将“with CTE AS(…)”移到顶部,它就会工作。感谢您的时间和努力,但出现错误:Msg 1033,Level 15,State 1,Line 21 ORDER BY子句在视图、内联函数、派生表、子查询中无效,和通用表表达式,除非还指定了TOP或FOR XML。仍然缺少某些内容…'Msg 8120,级别16,状态1,第5行列“LG_092_ITEMS.CODE”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。“我当然尝试了更新的列(不包含GROUP BY的列),并编写了新的错误消息……我无法想象您将如何获得该消息。”。如果没有GROUPBY子句,为什么SQL会发出该消息?对不起,我帮不上忙。
with CTE AS (
SELECT ITM.CODE
,itm.NAME
,STL.price AS [latestprice]
,ROW_NUMBER() OVER (PARTITION BY ITM.CODE, itm.NAME ORDER BY stl.date_ desc) AS RowN
FROM LG_092_ITEMS AS ITM
JOIN LG_092_01_STLINE AS STL ON ITM.LOGICALREF = STL.STOCKREF
WHERE STL.price > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
)
SELECT ITM.CODE
,itm.NAME
,min(isnull(STL.price, 0)) [min price]
,max(isnull(STL.price, 0)) [max]
,SUM(total) / SUM(amount) AS [avr]
,max(CTE.latestprice) AS latestprice
FROM LG_092_ITEMS AS ITM
JOIN LG_092_01_STLINE AS STL ON ITM.LOGICALREF = STL.STOCKREF
JOIN CTE ON CTE.CODE = itm.code AND CTE.name = ITM.name AND CTE.RowN = 1
WHERE STL.price > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
GROUP BY ITM.NAME,itm.code
ORDER BY itm.code
select *
from
(
SELECT
ITM.CODE
,itm.NAME
,isnull(price,0) as [latest price]
,min(isnull(price,0)) over (partition by ITM.name, itm.code) as [min price]
,max(isnull(price,0)) over (partition by ITM.name, itm.code) as [max]
,SUM(total)/SUM(amount) over (partition by ITM.name, itm.code) as [avr]
,row_number() over (partition by ITM.name, itm.code order by stl.date_ desc) as rn
FROM LG_092_ITEMS ITM
INNER JOIN LG_092_01_STLINE STL
ON ITM.LOGICALREF = STL.STOCKREF
WHERE PRICE > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
) tt
where tt.rn = 1
ORDER BY code
SELECT ITM.CODE
,itm.NAME
,min(isnull(STL.price, 0)) [min price]
,max(isnull(STL.price, 0)) [max]
,SUM(total) / SUM(amount) AS [avr]
--SON SATINALMA FIYATI
,ISNULL((SELECT TOP 1 PRC.PRICE FROM LG_092_01_STLINE AS PRC
WHERE PRC.STOCKREF = ITM.LOGICALREF
AND PRC.PRICE > 0
AND PRC.TRCODE = 1
AND PRC.CANCELLED = 0
AND PRC.INVOICEREF > 0
ORDER BY PRC.DATE_ DESC), 0) AS latestprice
FROM LG_092_ITEMS AS ITM
INNER JOIN LG_092_01_STLINE AS STL ON ITM.LOGICALREF = STL.STOCKREF
WHERE STL.PRICE > 0
AND TRCODE = 1
AND CANCELLED = 0
AND INVOICEREF > 0
GROUP BY ITM.LOGICALREF, ITM.CODE, ITM.NAME
ORDER BY ITM.CODE