【问题标题】:cross apply in sql with sum用 sum 在 sql 中交叉应用
【发布时间】:2012-11-06 08:38:39
【问题描述】:

我有以下查询:

insert into [MyDB].[dbo].[Reports_ActivityStat] (ActivityID,TaskID,LS_HowOthersAnswered,LS_ImproveMyChances)
(
SELECT
ActivityID=tasks.ActivityID,
TaskID=tasks.ID,
CAST(
        CASE 
            WHEN CHARINDEX('stats',item.value('(UsedLifeSavers)[1]', 'NVARCHAR(MAX)'))>0
                THEN 1 
            ELSE 0 
        END AS bit) as LS_HowOthersAnswered,
CAST(
        CASE 
            WHEN CHARINDEX('FiftyFifty',item.value('(UsedLifeSavers)[1]', 'NVARCHAR(MAX)'))>0
                THEN 1 
            ELSE 0 
        END AS bit) as LS_ImproveMyChances

FROM  [MyDB].[dbo].[Tasks] as tasks CROSS APPLY [Progress].nodes ('//Progress/Steps/ProgressStep') Progress(item)
)  

作用于以下Tasks 表:

 ID  |   ActivityID    |      Progress  
  1  |        1        |  [example below..]  
  2  |        1        |  [example below..]

Progress 是这样的 xml:

<Progress xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Steps>
    <ProgressStep>
      <FinishedOn>2012-10-30T13:07:52.6374861+02:00</FinishedOn>
      <Score>0</Score>
      <StartedOn>2012-10-30T13:07:45.8234861+02:00</StartedOn>
      <Status>Finished</Status>
      <StepIndex>0</StepIndex>
      <StepType>Summary</StepType>
      <UsedLifeSavers xmlns:a="http://schemas.datacontract.org/2004/07/MindLab.Logic.Study" />
    </ProgressStep>
    <ProgressStep>
      <FinishedOn i:nil="true" />
      <PartNumber>1</PartNumber>
      <Score>0</Score>
      <StartedOn>2012-10-30T13:07:52.6374861+02:00</StartedOn>
      <Status>NotFinished</Status>
      <StepIndex>1</StepIndex>
      <StepType>Information</StepType>
      <SubmittedAnswersCount>0</SubmittedAnswersCount>
      <UsedLifeSavers xmlns:a="http://schemas.datacontract.org/2004/07/MindLab.Logic.Study">
        <a:LifeSavers>Stats</a:LifeSavers>
        <a:LifeSavers>FiftyFifty</a:LifeSavers>
      </UsedLifeSavers>
    </ProgressStep>  
  </Steps>
</Progress>  

(通常有2个以上的步骤..)

我的查询产生(不是实际数据,只是示例):

 ID  |   ActivityID    |   TaskID   |    LS_HowOthersAnswered   |   LS_ImproveMyChances
  1  |        1        |      1     |             0             |             0
  2  |        1        |      1     |             1             |             0  
  3  |        1        |      1     |             0             |             0    

这几乎是我需要的,但并不完全。
对于每个唯一的 TaskID,我需要所有 LS_HowOthersAnsweredLS_ImproveMyChances 中的 SUM
我试图分组,但没能成功,因为这与常规的内部连接太不同了..

【问题讨论】:

    标签: sql-server sum cross-apply


    【解决方案1】:

    发现:

    insert into [MyDB].[dbo].[Reports_ActivityStat] (ActivityID,TaskID,LS_HowOthersAnswered,LS_ImproveMyChances)
    (
    SELECT
    ActivityID=tasks.ActivityID,
    TaskID=tasks.ID,    
    SUM (CAST(
            CASE 
                WHEN CHARINDEX('stats',item.value('(UsedLifeSavers)[1]', 'NVARCHAR(MAX)'))>0
                    THEN 1 
                ELSE 0 
            END AS int)
            ),
    
    SUM (CAST(
            CASE 
                WHEN CHARINDEX('FiftyFifty',item.value('(UsedLifeSavers)[1]', 'NVARCHAR(MAX)'))>0
                    THEN 1 
                ELSE 0 
            END AS int)
            )  
    
    FROM  [MyDB].[dbo].[Tasks] as tasks CROSS APPLY [Progress].nodes ('//Progress/Steps/ProgressStep') Progress(item)
    group by tasks.ID
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 2021-04-16
      • 2021-07-05
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多