Select语句将基于多个记录返回一个记录

时间:2020-09-03 09:48:50

标签: sql sql-server group-by count having-clause

曾见过类似的问题,但并不完全相同。我有一个带有多个ID的表,并想做一个适合所有PID的select语句,并返回一次

const Login = (props) => {
      const [inputs, setInputs] = useState({
        userid: "",
        password: "",
        rememberPassword: false,
      });
      const [submitted, setSubmitted] = useState(false);
      const { userid, password, rememberPassword } = inputs;
    
      // reset login status
      useEffect(() => {
        dispatch(loginActions.logout());
      }, []);
    
      function handleChange(e) {
        const { name, value } = e.target;
        setInputs((inputs) => ({ ...inputs, [name]: value }));
      }
    
      function handleChechbox(e) {
        const { name, value } = e.target;
        console.log("eeeeee check", e.target.type);
        console.log("eeeeee check", e.target.checked);
        console.log("eeeeee check inputs", inputs);
        console.log("eeeeee check inputs remember", inputs.rememberPassword);
        if (e.target.type === "checkbox" && !e.target.checked) {
          setInputs((inputs) => ({ ...inputs, [name]: "" }));
        } else {
          setInputs((inputs) => ({ ...inputs, [name]: value }));
        }
      }
    
      function handleSubmit(e) {
        e.preventDefault();
        setSubmitted(true);
        if (inputs) {
          // get return url from location state or default to home page
          const { from } = location.state || {
            from: { pathname: "/admin/summary" },
          };
          dispatch(loginActions.login(inputs, from));
          // props.history.push("/admin/summary");
        }
      }
    
      return (
        <div className="Login">
          <div className="login-form-container">
            <div className="content">
              <Form className="login-form" onSubmit={handleSubmit}>
                <InputGroup>
                  <InputGroupAddon
                    className="input-group-addon"
                    addonType="prepend"
                  >
                    <i className="fa fa-user"></i>
                  </InputGroupAddon>
                  <input
                    autoFocus
                    type="email"
                    aria-label="Username"
                    aria-describedby="Username"
                    aria-invalid="false"
                    placeholder="Username or Email"
                    name="userid"
                    value={userid}
                    onChange={(event) => handleChange(event)}
                    className={
                      "form-control" + (submitted && !userid ? " is-invalid" : "")
                    }
                  />
                  {submitted && !userid && (
                    <div className="invalid-feedback">
                      Username or Email is required
                    </div>
                  )}
                </InputGroup>
                <InputGroup>
                  <InputGroupAddon
                    className="input-group-addon"
                    addonType="prepend"
                  >
                    <i className="fa fa-lock"></i>
                  </InputGroupAddon>
                  <input
                    type="password"
                    name="password"
                    placeholder="Password"
                    aria-label="password"
                    aria-describedby="password"
                    value={password}
                    onChange={(event) => handleChange(event)}
                    className={
                      "form-control" + (submitted && !password ? " is-invalid" : "")
                    }
                  />
                  {submitted && !password && (
                    <div className="invalid-feedback">Password is required</div>
                  )}
                </InputGroup>
                <div className="form-actions">
                  <br />
                  <div className="form-check">
                    <input
                      type="checkbox"
                      className="form-check-input"
                      id="rememberPassword"
                      name="checkbox"
                      checked={rememberPassword}
                      onChange={(event) => handleChechbox(event)}
                      // required
                    />
                    <label className="form-check-label" for="rememberPassword">
                      Remember me
                    </label>
                  </div>
                </div>
              </Form>
            </div>
          </div>
        </div>
      );
    };

换句话说,如果123 = TR且234 = US且536 = L(希望如此)返回1,而不是1,1,1。

我做不到

+----+-----+-----+-------+
| ID | PID | DET | DETOP |
+----+-----+-----+-------+
|  1 | 123 | TR  | EQ    |
|  1 | 234 | US  | EQ    |
|  1 | 536 | L   | EQ    |
|  2 | 123 | TR  | EQ    |
|  2 | 234 | US  | EQ    |
|  2 | 536 | D   | EQ    |
+----+-----+-----+-------+

那样只会返回零结果。最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

我认为您想要HAVING

SELECT ID
FROM dbo.YourTable
GROUP BY ID
HAVING COUNT(CASE WHEN PID = 123 AND DET = 'TR' THEN 1 END) > 0
   AND COUNT(CASE WHEN PID = 243 AND DET = 'US' THEN 1 END) > 0
   AND COUNT(CASE WHEN PID = 536 AND DET = 'L' THEN 1 END) > 0;

答案 1 :(得分:2)

您可以使用聚合和Runnable。假设没有重复的having,您可以这样写:

(id, pid, det)

答案 2 :(得分:2)

这是关系划分的经典案例。解决方法是:

CREATE TABLE MYTABLE (ID  INT,
                      PID INT , 
                      DET CHAR(3),
                      DETOP  CHAR(2),
                      PRIMARY KEY (ID, PID));
GO
INSERT INTO MYTABLE VALUES
(1,     123,   'TR',     'EQ'),
(1,     234,   'US',     'EQ'),
(1,     536,   'L ',     'EQ'),
(2,     123,   'TR',     'EQ'),
(2,     234,   'US',     'EQ'),
(2,     536,   'D ',     'EQ');

用于数据测试。

查询以解决此问题:

WITH 
DATASET AS
(SELECT * 
 FROM (VALUES (123, 'TR'), 
              (234, 'US'), 
              (536, 'L')) 
       T(PID, DET))
SELECT M.ID
FROM   DATASET AS D
       JOIN MYTABLE AS M
          ON D.PID = M.PID AND D.DET = M.DET
GROUP  BY M.ID
HAVING COUNT(*) = (SELECT COUNT(DISTINCT PID) 
                   FROM   DATASET)
相关问题