根据特定值选择行组合

时间:2017-01-31 10:15:19

标签: mysql sql combinations

我有这张桌子:

WeekID  ISModelled  ProductID   Units   Value
1       MODEL       123         0       0
2       EPOS        123         0       0
2       MODEL       123         100     50
3       IMPUTE      987         100     50
4       MODEL       123         100     50
4       EPOS        987         100     50
4       EPOS        123         100     50
5       EPOS        987         0       0
5       MODEL       987         100     50

我希望从中获得这种可能的组合:

WeekID  ISModelled  ProductID   Units   Value
2       EPOS        123         0       0
2       MODEL       123         100     50
5       EPOS        987         0       0
5       MODEL       987         100     50

我想在ProductIDWeekID选择ISModelled列与" EPOS"的任何组合。 UnitsValue列中的值为0,IsModelledUnits列中带有Model的Value列的值大于0

感谢所有帮助!

2 个答案:

答案 0 :(得分:0)

这看起来像是带有unpivot的匹配对问题,可能没有匹配或多个匹配 - 分配行号应该有助于此  可能性。

function debounce(func, wait, immediate) {
  var timeout;
  return function () {
    var context = this, args = arguments;
    var later = function () {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
}

$(document).on("keyup", "#SearchTerm", debounce(function (e) {
  e.preventDefault();
  var form = $(e.target).closest('form');
  $(form).submit();
}, 300))

答案 1 :(得分:0)

这里的其他答案提供了一些有效的选项,但还有另一种适用于此的ANSI-SQL模式。

SELECT
    *
FROM
    yourTable
INNER JOIN
(
    SELECT
        WeekID,
        ProductID
    FROM
        yourTable
    WHERE
           (IsModelled = 'MODEL' AND Units > 0 AND Value > 0)
        OR (IsModelled = 'EPOS'  AND Units = 0 AND Value = 0)
    GROUP BY
        WeekID,
        ProductID
    HAVING
        COUNT(DISTINCT IsModelled) = 2
)
    matchingPairs
        ON  matchingPairs.WeekID    = yourTable.WeekID
        AND matchingPairs.ProductID = yourTable.ProductID
WHERE
    yourTable.IsModelled IN ('MODEL', 'EPOS')
ORDER BY
    WeekID,
    ProductID,
    IsModelled

这实际上与使用EXISTS和相关子查询的答案类似。但是,性能应该更好,因为只使用一个子查询,并且该子查询不是相关的(MySQL通常具有较差的性能)

它还可以减少重复代码和(在我看来)更清晰的意图(可读性)

注意: 我认为(WeekId, ProductID, IsModelled)是唯一的。