【问题标题】:Finding an Item based on certain criteria in SQL在 SQL 中根据特定条件查找项目
【发布时间】:2021-11-24 05:42:10
【问题描述】:

我的表结构如下:

交易表:

code    type        action  level   id  qty   OrderID
====================================================
10005   PRODUCT     RECIPE  0       0   1     O-123  
821     VALUE_MEAL  RECIPE  0       1   1     O-123
9       PRODUCT     RECIPE  1       1   1     O-123
7093    PRODUCT     RECIPE  1       1   1     O-123
10005   PRODUCT     CHOICE  1       1   1     O-123
721     VALUE_MEAL  RECIPE  0       2   1     O-123
9       PRODUCT     RECIPE  1       2   1     O-123
7093    PRODUCT     RECIPE  1       2   1     O-123
10005   PRODUCT     CHOICE  1       2   1     O-123

我的主表

code      FullName   MenuCategory 
---------------------------------
821         ML2       Group2  
721         ML1       Group2   
9           fires     Group2   
10005       Orange    Group3 

预期结果集:

code    QTY with Meal   Sold Alone
------------------------------------
10005        2              1

在预期结果中,我们需要区分商品代码“10005”是与具有不同级别和 id 的 VALUE_MEAL 一起出售的,还是在同一订单中作为 PRODUCT 单独出售?

示例:code=821,包含三个主要的子级别(9、7093、10005)和code=721,包含三个主要的子级别(9、7093、10005) 所以在这里我们知道 2 个数量以 10005 的价格出售,因为它是 VALUE_MEALS 的一部分,而一个数量为代码 = 10005 作为独立产品的一部分

【问题讨论】:

  • 您肯定有不同的“超值餐”组合吗?如果是这样,您如何在事务表中区分它们?您的样本数据中似乎只有 1 次明显的“超值餐”,而且根本不包括 10005。你的逻辑是什么?请为您的表格发布 DDL - 我们需要了解约束。
  • 所以解释您的预期结果,这对您来说可能很明显,但不要指望人们猜测。
  • @SMor,VALUE_MEAL 是包含子项的父项,例如 code = 821 包含 9、7093 和 10005 作为 id 1 的子级别
  • @Stu 希望你现在能理解我的逻辑

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

看起来你只想要一个分组的自联接,带有条件聚合

SELECT
  t.code,
  [QTY with Meal] = COUNT(t2.IsMeal),  -- only counts non nulls
  [Sold Alone] = COUNT(*) - COUNT(t2.IsMeal)
FROM [Transaction] t
CROSS APPLY (
    SELECT IsMeal =  CASE WHEN COUNT(*) > 0 THEN 1 ELSE NULL END
    FROM [Transaction] t2
    WHERE t2.id = t.id
      AND t2.type = 'VALUE_MEAL'
) t2
WHERE t.code = 10005
GROUP BY
  t.code;

您还可以将子查询中的COUNT(*) 切换为EXISTS

【讨论】:

    【解决方案2】:

    对于每个 (OrderID, code) 唯一对,查询使用“级别”列来确定项目是否已组合在一顿饭中

    select OrderID, code, 
           sum(case when [level]>0 then 1 else 0 end) [QTY with Meal],
           sum(case when [level]=0 then 1 else 0 end) [Sold Alone]
    from TransactionTable
    group by OrderID, code
    order by OrderID, code;
    

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2016-05-11
      相关资源
      最近更新 更多