Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql选择查询有问题_Sql_Sql Server 2005 - Fatal编程技术网

sql选择查询有问题

sql选择查询有问题,sql,sql-server-2005,Sql,Sql Server 2005,我对[PortfelID]专栏有点问题。我需要它的ID,以便能够在函数中使用它,该函数将返回我关于每个客户端的策略类型的名称。然而,通过这样做,我需要将[PortfelID]放入GroupBy中,这会使结果复杂化很多 我正在寻找一种方法来找到这种策略的类型和资金总额。然而,如果我使用groupby[PortfelID]我会得到每个策略的多个条目。实际上超过700行(因为有700个[PortfelID]值)。我想要的只是一个策略和这个策略的[WycenaWartosc]之和。所以总共我会得到15行

我对[PortfelID]专栏有点问题。我需要它的ID,以便能够在函数中使用它,该函数将返回我关于每个客户端的策略类型的名称。然而,通过这样做,我需要将[PortfelID]放入
GroupBy
中,这会使结果复杂化很多

我正在寻找一种方法来找到这种策略的类型和资金总额。然而,如果我使用
groupby[PortfelID]
我会得到每个策略的多个条目。实际上超过700行(因为有700个[PortfelID]值)。我想要的只是一个策略和这个策略的[WycenaWartosc]之和。所以总共我会得到15行左右

是否有一种方法可以使用该函数而不必在Group By中添加[PortfelID]

DECLARE @data DateTime
SET @data = '20100930'

SELECT [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data)
      ,SUM([WycenaWartosc]) AS 'Wycena'   
  FROM[dbo].[Wycena]
  LEFT JOIN [KlienciPortfeleKonta]
  ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
  WHERE [WycenaData] = @data 
  GROUP BY [PortfelID]
其中[dbo].[ufn_typtstrategiidlaportfeladaty]的定义如下:

ALTER FUNCTION [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty]
    (
      @portfelID INT,
      @data DATETIME 
    )
RETURNS NVARCHAR(MAX)
AS BEGIN
    RETURN ( SELECT TOP 1
                    [TypyStrategiiNazwa]
             FROM   [dbo].[KlienciPortfeleUmowy]
                    INNER JOIN [dbo].[TypyStrategii]
                    ON dbo.KlienciPortfeleUmowy.TypyStrategiiID = dbo.TypyStrategii.TypyStrategiiID
             WHERE  [PortfelID] = @portfelID
                    AND ( [KlienciUmowyDataPoczatkowa] <= @data
                          AND ([KlienciUmowyDataKoncowa] >= @data
                          OR KlienciUmowyDataKoncowa IS NULL)
                        )
             ORDER BY [KlienciUmowyID] ASC
           )

   end
  SELECT SUM(CASE WHEN [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) = 'portfel energetyka' THEN [WycenaWartosc] ELSE 0 END) AS 'Strategy 1'
 ,SUM(CASE WHEN [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) = 'banków niepublicznych' THEN [WycenaWartosc] ELSE 0 END) AS 'Strategy 2'
  FROM [dbo].[Wycena]
  LEFT JOIN [KlienciPortfeleKonta]
  ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
  WHERE [WycenaData] = @data
但这似乎有点矫枉过正,需要做的手工工作也太多了。亚历克斯的解决方案似乎正是我所需要的:-)

在sql中使用“Case”语句怎么样? 检查以下链接,例如:


希望这能有所帮助。

这里有一个如何做到这一点的想法

DECLARE @data DateTime
SET @data = '20100930'

SELECT 
   TypID,
   SUM([WycenaWartosc]) AS 'Wycena'
FROM 
(
  SELECT [dbo].[ufn_TypStrategiiDlaPortfelaDlaDaty] ([PortfelID], @data) as TypID
  ,[WycenaWartosc]
  FROM[dbo].[Wycena]
  LEFT JOIN [KlienciPortfeleKonta]
  ON [Wycena].[KlienciPortfeleKontaID] = [KlienciPortfeleKonta].[KlienciPortfeleKontaID] 
  WHERE [WycenaData] = @data
) as Q
GROUP BY [TypID]
所以基本上不需要按PortfelID分组(只要需要按[dbo].[ufn_typstrategiidlaportfeladaty]的输出进行分组)

不过,这个查询不是最优的。如果PortfelID和WycenaData不在[KlienciPortfeleKonta]表中,则可以将Join推送到外部查询


更新:修复了选择列表和聚合函数应用程序

我知道CASE语句,但不知道如何在这里使用它?还是我遗漏了什么?请查看此Web链接以获取更合适的语法示例:Just to add。。您可以在每个“case”下使用您的profile_ID,并将其汇总到另一个字段中。希望这有帮助。如果没有,请告诉我。。我可以帮你更多。我知道你要去哪里。但是有没有一种方法可以动态地创建CASE语句呢?策略列表现在大约有15个条目,但在一个月内可能会有16个条目,甚至更多,用户可以随意添加。我认为这将是一个棘手的问题。但是,如果要使用上述所需的格式,那么可能需要使用静态case语句,而不是动态case语句。然而,我觉得,只要你还有一个类别,改变只是增加了一个案例陈述。case语句的数量是一直增加还是很少增加?如果我不使用GROUP BY->
Msg 8120,第16级,状态1,第16行列“KlienciPortfeleKonta.PortfelID”在select列表中无效,因为它不包含在聚合函数或GROUP BY子句中
如果我在
GROUP BY[PortfelID])内添加Q
i get
列“Q.Wycena”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
对此表示抱歉-看起来我忘记修复select list/聚合。更新了我的答案。嗯。